2012-06-21 23 views
11

Tôi đang phát triển một dịch vụ WCF sẽ được tiêu thụ bởi nhiều ứng dụng khách hàng khác nhau. Để làm cho một chức năng hoạt động, máy chủ cần phải đọc một tệp XML thành một C# DataContract mà sau đó được truyền cho khách hàng có liên quan. Theo như tôi hiểu từ trang web MSDN, điều này là có thể nhưng tôi không thể tìm thấy bất kỳ ví dụ hoàn chỉnh. Cụ thể, trang web nói về thông số 'luồng' mà tôi chưa hoàn toàn hiểu.Làm thế nào để tuần tự hóa/deserialize một C# WCF DataContract đến/từ XML

Hợp đồng dữ liệu của tôi có một trường thuộc tính là danh sách một hợp đồng dữ liệu khác có nhiều trường thuộc tính đơn giản.

ví dụ:

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

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

Lớp học của tôi trông giống như thế này.

+0

trùng lặp: http://stackoverflow.com/questions/4858798/datacontract-xml-serialization-and-xml-attributes – DarthVader

Trả lời

13

Dưới đây là một ví dụ

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 gì làm gì? và điều gì sẽ xảy ra nếu tôi chỉ muốn thêm 1 phần tử vào tệp XML? – temelm

+0

[từ siêu dữ liệu] - Khi được ghi đè trong lớp dẫn xuất, hãy viết khai báo XML với phiên bản "1.0". Và mã này chỉ ghi 1 đối tượng vào tệp, nếu đó là ý của bạn. – Bond

+0

nó viết một đối tượng nhưng đối tượng đó là một danh sách các đối tượng khác vì vậy nó là tốt. làm thế nào về việc đọc một tài liệu XML hiện có vào một datacontract. bất kỳ ý tưởng? – temelm

0

Có là NetDataContractSerializer mà giải quyết một bó toàn bộ các vấn đề khi sử dụng WCF.

Xem ở đây MSDN NetDataContractSerializer

Nó thường được sử dụng cho gói tất cả các loại của các đối tượng và vượt qua nó trên WCF.

Bạn có thể sử dụng nó cho gói đối tượng vào một byte[] và vận chuyển nó trên WCF, trên serverside, bạn có thể dễ dàng Deserialize đối tượng và làm bất cứ điều gì bạn muốn với họ.

Đây là một cuộc thảo luận về cách sử dụng Serializer này một cách chính xác: MSDN Social

Đoạn mã được cung cấp cũng có!

+1

WTF, một liên kết đến trang web Microsoft GERMAN ??? bạn có thể có nghĩa là: http://msdn.microsoft.com/library/system.runtime.serialization.netdatacontractserializer.aspx – Luuk

2

Điều này có thể hữu ích cho bạn. Khi bạn cần XElement. Ví dụ khi bạn sẽ nối thêm nút vào XDocument hoặc replece XElement của tài liệu này.

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