2009-03-03 5 views
6

Ich weiß, dass ein privater parameterloser Konstruktor funktioniert, aber was ist mit einem Objekt ohne parameterlose Konstruktoren?Ist es möglich, Objekte ohne einen parameterlosen Konstruktor in WCF zu serialisieren?

Ich möchte Typen aus einer Third-Party-Bibliothek verfügbar machen, so habe ich keine Kontrolle über die Typdefinitionen.

Wenn es einen Weg gibt, was ist am einfachsten? Z.B. Ich habe nicht was ich haben muss, um einen Untertyp zu erstellen.

Edit:

Was ich suche ist so etwas wie die Höhe der Anpassung hier gezeigt: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx obwohl ich will nicht Strom zurückgreifen müssen serialisiert/deserialisieren.

Antwort

5

Sie können nicht wirklich beliebige Typen serialisierbar machen; In einigen Fällen (z. B. XmlSerializer) bietet die Laufzeit Optionen, um die Attribute zu fälschen. Aber DataContractSerializer erlaubt dies nicht.Machbar Optionen:

  • verstecken die Klassen hinter Ihren eigenen Typen, die sind serializable (viel Arbeit)
  • binären Formatter Surrogate liefern (yeuch)
  • schreiben Sie Ihre eigene Serialisierung Kern (eine Menge Arbeit zu erhalten rechts)

Wesentlichen, wenn etwas nicht für die Serialisierung ausgelegt ist, sehr wenig von dem Rahmen wird lassen Sie serialisieren es.

+0

Es ist schade, ich möchte etwas wie Erweiterungsmethoden, wo das Framework nach einer Erweiterungsmethode für das Objekt sucht und wenn es existiert, ruft es es auf Serialisierung/Deserialisierung auf. –

+1

Das Framework kann nicht wirklich nach Erweiterungsmethoden suchen; Sie sind ein Compiler-Trick. Wenn es mehrere gab, welche würde es auswählen? Was du beschreibst, ist Surrogate nahe, aber das ist immer noch eine Menge Arbeit. –

+0

Ja, ich denke du musst deine Implementierung irgendwie registrieren. Es gibt nur so viele Hooks in WCF, wenn es nur einen für die Serialisierung gibt, der einfach und leistungsfähig ist (d. H. Es ist nicht notwendig, die Typen zu besitzen, die serialisiert werden). –

1

Ich bin kein WCF-Experte, aber es ist unwahrscheinlich, dass sie Serialisierung auf einem Konstruktor mit beliebigen Typen unterstützen. Denn was würden sie für Werte tun? Sie könnten NULL für Referenztypen und leere Werte für Strukturen übergeben. Aber was nützt ein Typ, der mit völlig leeren Daten konstruiert werden könnte?

Ich denke, Sie sind mit 1 von 2 Optionen stecken

  1. Unterklasse der in Rede stehenden Art und entsprechende Standardwerte an dem nicht-parameterlosen Konstruktor
  2. einen Typen erstellen geben, die soley für die Serialisierung vorhanden ist. Sobald es fertig ist, kann es eine Instanz des ursprünglichen Typs erstellen, der Sie interessiert. Es ist eine Art Brücke.

Persönlich würde ich für # 2 gehen. Machen Sie die Klasse zu einer reinen Datenstruktur und optimieren Sie sie für Serialisierungs- und Fabrikzwecke.

+0

Das Problem mit diesem ist, dass es eine Menge von Typen in der Bibliothek gibt und ich alle Arten zuordnen müsste, über die ich jetzt mit einer Teilmenge der Typen in der 3rd-Party-Bibliothek tue. –

1

Ich habe gerade einen kleinen Test mit einem WCF-Dienst ausgeführt, der ein Basisobjekt zurückgibt, das keinen Standardkonstruktor hat.

//[DataContract] 
//[Serializable] 
public class MyObject 
{ 
    public MyObject(string _name) 
    { 
     Name = _name; 
    } 

    //[DataMember] 
    public string Name { get; set; } 

    //[DataMember] 
    public string Address { get; set; } 
} 

Hier ist, was der Dienst wie folgt aussieht:

public class MyService : IMyService 
{ 
    #region IMyService Members 

    public MyObject GetByName(string _name) 
    { 
     return new MyObject(_name) { Address = "Test Address" }; 
    } 

    #endregion 
} 

Diese tatsächlich funktioniert, solange MyObject ist entweder ein [Datacontract] oder [Serializable]. Interessanterweise scheint der Standardkonstruktor auf der Clientseite nicht benötigt zu werden. Es gibt einen Zusammenhang Beitrag hier:

How does WCF deserialization instantiate objects without calling a constructor?

+0

Leider sind die Frametypen von Drittanbietern nicht als [DataContract] oder [Serializable] gekennzeichnet. –

+0

Das bedeutet, dass sie nicht serialisiert wurden, also serialisieren Sie sie nicht. –

+1

Möglicherweise können Sie ein serialisierbares Adapterobjekt schreiben, das die Typen von Drittanbietern umschließt und nur die benötigten Teile serialisiert. –