2012-06-21 4 views
11

Ich entwickle einen WCF Service, der von mehreren verschiedenen Klientenanwendungen verbraucht wird. Um eine Funktionalität funktionsfähig zu machen, muss der Server eine XML-Datei in einen C# DataContract einlesen, der dann an den betroffenen Client weitergeleitet wird. Soweit ich das von der MSDN-Website verstehe, ist dies möglich, aber ich konnte keine vollständigen Beispiele finden. Insbesondere spricht die Website von einem "Stream" -Parameter, den ich noch nicht ganz verstehe.Wie man einen C# WCF DataContract zu/von XML serialisiert/deserialisiert

Mein Datenvertrag hat ein Eigenschaftsfeld, das eine Liste eines anderen Datenvertrags mit mehreren einfachen Eigenschaftsfeldern ist.

z.B.

[DataContract] 
    public class MyClass1 { 
     [DataMember] 
     public string name; 
     [DataMember] 
     public int age; 
    } 

    [DataContract] 
    public class MyClass2 { 
     [DataMember] 
     public List<MyClass1> myClass1List; 
    } 

Meine Klassen sehen in etwa so aus.

+0

Duplikat: http://stackoverflow.com/questions/4858798/datacontract-xml-serialization-and-xml-attributes – DarthVader

Antwort

13

Hier ist ein Beispiel

MyClass1 obj = new MyClass1(); 
DataContractSerializer dcs = new DataContractSerializer(typeof(MyClass1)); 

using (Stream stream = new FileStream(@"C:\tmp\file.xml", FileMode.Create, FileAccess.Write)) 
{ 
    using (XmlDictionaryWriter writer = 
     XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8)) 
    { 
     writer.WriteStartDocument(); 
     dcs.WriteObject(writer, obj); 
    } 
} 

Books b = new Books(); 

DataContractSerializer dcs = new DataContractSerializer(typeof(Books)); 

try 
{ 
    Stream fs = new FileStream(@"C:\Users\temelm\Desktop\XmlFile.xml", FileMode.Create, FileAccess.Write); 

    XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateTextWriter(fs, Encoding.UTF8); 
    xdw.WriteStartDocument(); 
    dcs.WriteObject(xdw, b); 
    xdw.Close(); 
    fs.Flush(); 
    fs.Close(); 
} 
catch (Exception e) 
{ 
    s += e.Message + "\n"; 
} 
+0

@KirkWoll was bedeutet tun? Und was, wenn ich nur ein Element an die XML-Datei anhängen möchte? – temelm

+0

[from metadata] - Beim Überschreiben in einer abgeleiteten Klasse schreibt die XML-Deklaration mit der Version "1.0". Und dieser Code schreibt nur ein Objekt in die Datei, wenn Sie das meinen. – Bond

+0

es schreibt ein Objekt, aber das Objekt ist eine Liste von anderen Objekten, so ist es in Ordnung. Wie wäre es mit dem Lesen eines vorhandenen XML-Dokuments in einen Datenvertrag? irgendwelche Ideen? – temelm

0

Dort wird der NetDataContractSerializer ist, die eine ganze Reihe von Problemen löst, wenn WCF verwenden.

Siehe hier MSDN NetDataContractSerializer

es in der Regel für die Verpackung alle Arten von Objekten verwendet wird und es über WCF übergeben.

Sie können es für Objekte in eine byte[] und transportieren sie über WCF, auf der serverseitigen Verpackung, können Sie einfach die Objekte Deserialize und tun, was Sie mit ihnen wollen.

Hier ist eine Diskussion darüber, wie diese Serializer richtig verwenden: MSDN Social

-Code-Schnipsel auch zur Verfügung gestellt werden!

+1

WTF, ein Link zur deutschen Microsoft-Site ??? Sie wahrscheinlich gemeint: http://msdn.microsoft.com/library/system.runtime.serialization.netdatacontractserializer.aspx – Luuk

2

Dies kann für Sie nützlich sein. Wenn Sie XElement benötigen. Zum Beispiel, wenn Sie Knoten an XDocument anhängen oder XElement dieses Dokuments ersetzen.

private XElement objectToXElement(SomeContractType obj) 
     { 
      DataContractSerializer dcs = new DataContractSerializer(typeof(SomeContractType); 

      var ms = new MemoryStream(); 
      var xw = XmlWriter.Create(ms); 
      dcs.WriteObject(xw, obj); 
      xw.Flush(); 
      xw.Close(); 
      ms.Position = 0; 
      XElement xe = XElement.Load(ms); 

      return xe; 
     } 
Verwandte Themen