2012-06-21 12 views
11

Pracuję nad usługą WCF, która będzie używana przez wiele różnych aplikacji klienckich. Aby jedna funkcjonalność działała, serwer musi odczytać plik XML do C# DataContract, który jest następnie przekazywany do danego klienta. O ile rozumiem na stronie internetowej MSDN, jest to możliwe, ale nie mogłem znaleźć żadnych pełnych przykładów. W szczególności strona internetowa mówi o parametrze "strumienia", którego jeszcze nie rozumiem.Jak serializować/deserializować C# WCF DataContract do/z XML

Moja umowa na dane ma jedno pole właściwości, które jest listą innej umowy danych, która ma wiele prostych pól właściwości.

np.

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

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

Moje zajęcia wyglądają mniej więcej tak.

+0

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

Odpowiedz

13

Oto przykład

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 co robi zrobić? a co jeśli chcę tylko dołączyć 1 element do pliku XML? – temelm

+0

[z metadanych] - Gdy zostanie zastąpione w klasie pochodnej, wypisze deklarację XML z wersją "1.0". Ten kod zapisuje tylko jeden obiekt do pliku, jeśli o to ci chodzi. – Bond

+0

zapisuje jeden obiekt, ale ten obiekt jest listą innych obiektów, więc wszystko jest w porządku. co powiesz na odczytywanie istniejącego dokumentu XML do datacontract. jakieś pomysły? – temelm

0

Istnieje NetDataContractSerializer który rozwiązuje całą masę problemów podczas używania WCF.

Zobacz tutaj MSDN NetDataContractSerializer

To jest zwykle używany do pakowania wszelkiego rodzaju obiektów i przekazać go WCF.

Można go używać do owijania przedmiotów w byte[] i przetransportować ją na WCF, na serverside, można łatwo deserializowania obiektów i zrobić cokolwiek chcesz z nimi.

Oto dyskusja na temat korzystania z tej serializer poprawnie: MSDN Social

Fragmenty kodu są tam też!

+1

WTF, link do niemieckiej strony Microsoftu ??? prawdopodobnie oznaczało to: http://msdn.microsoft.com/library/system.runtime.serialization.netdatacontractserializer.aspx – Luuk

2

Może to być przydatne dla Ciebie. Kiedy potrzebujesz XElement. Na przykład, gdy idziesz dołączyć węzeł do XDocument lub replece XElement tego dokumentu.

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; 
     }