Wie serialisiere ich alle Eigenschaften eines NHibernate-gemappten Objekts?

7

Ich habe einige Webmethoden, die meine Objekte als serialisiertes XML zurückgeben. Es werden nur die NHibernate-Eigenschaften des Objekts serialisiert ... jeder hat einen Einblick? Es scheint so zu sein, dass die Webmethoden tatsächlich die NHibernate-Proxies anstelle meiner Klassen serialisieren. Ich habe versucht mit [XMLInclude] und [XMLElement], aber die Eigenschaften sind immer noch nicht serialisieren. Ich habe eine wirklich schreckliche hackische Art, das zu umgehen, aber ich fragte mich, ob es einen besseren Weg gab!

In etwa so:

%Vor%

Dies ist offensichtlich keine Möglichkeit, Code zu schreiben. Wenn ich das "falsche" Mapping dort nicht habe (UglyHack-Eigenschaft), wird diese Eigenschaft nicht serialisiert. Für jetzt bin ich in der Verwendung von (Data) Transfer Objects, und möglicherweise auf etwas mit Reflexion ...

    
wprl 27.07.2009, 21:24
quelle

3 Antworten

21

Die beste Art, das gemappte NH-Objekt zu serialisieren, besteht darin, es nicht zu serialisieren :).

Wenn Sie es über den Draht senden, sollten Sie wirklich ein DTO dafür erstellen. Wenn Sie dieses Objekt nicht erstellen möchten, können Sie [XmlIgnore] für Eigenschaften festlegen, die nicht serialisiert werden sollen.

Wenn Sie alle Eigenschaften haben wollen, müssen Sie sie ALLE aus der Datenbank laden - für einige wird eine eifrige Ladung für andere ausreichen (wo zu viele Verknüpfungen Daten duplizieren), müssen Sie auf diese Eigenschaft in irgendeiner Weise zugreifen Sie möchten die Last auslösen.

Bearbeiten:

Und ich möchte noch etwas hinzufügen - das Senden von Domain-Entitäten über die Leitung ist immer eine schlechte Idee. In meinem Fall habe ich es auf die harte Tour gelernt - ich habe einige Entitäten über einen WebService verfügbar gemacht - und nun fast jede Änderung (eine Eigenschaft umbenennen, eine Eigenschaft entfernen etc.) In meine Domain zerstört die App mit dem WS - plus eine ganze Menge Eigenschaften haben [XmlIgnore] auf ihnen (nicht über zirkuläre Abhängigkeiten vergessen).

Wir werden bald genug eine Neufassung machen - aber seien Sie versichert, dass ich das nie wieder tun werde. :)

Bearbeiten 2

Sie können AutoMapper zum Übertragen der Daten von Ihrer Entität zum DTO verwenden. Sie haben einige Beispiele auf der Website.

    
sirrocco 28.07.2009, 03:58
quelle
4

Wenn es ein WCF-Dienst ist, könnten Sie ein IDataContractSurrogate

verwenden %Vor%

Implementierung im Host:

%Vor%     
Emmanuel 04.05.2011 11:40
quelle
0

Vereinbaren Sie mit sirrocco, ich hatte die schrecklichste Zeit zu versuchen, NHibernate-Entitäten durch WCF zu serialisieren, und ging schließlich mit einer DTO-Lösung, die generisch durch Reflexion gemacht wurde.

Bearbeiten: Die gesamte Lösung ist zu groß, um hier zu posten, und ist natürlich auf meine Bedürfnisse zugeschnitten, also werde ich ein paar relevante Abschnitte veröffentlichen:

%Vor%

dann, wenn Sie den DTO wiederbeleben wollen:

%Vor%     
Miki Watts 29.07.2009 16:02
quelle