2009-07-24 30 views
8

Tôi đã đọc nhiều bài viết về các loại đã biết và tôi tin rằng ví dụ của tôi sẽ hoạt động. Nhưng nó không. Tôi nhận được ngoại lệ sau về deserialization và không hiểu lý do tại sao:DataContractSerializer, KnownType và thừa kế

Lỗi ở vị trí dòng 1 2. Yêu cầu yếu tố 'A' từ không gian tên 'http://schemas.datacontract.org/2004/07/ConsoleApplication2' .. Đã gặp 'Element' với tên 'C', không gian tên 'http://schemas.datacontract.org/2004/07/ConsoleApplication2'.

using System; 
using System.Runtime.Serialization; 
using System.Xml; 
using System.IO; 

namespace ConsoleApplication2 
{ 
    [DataContract][KnownType(typeof(C))]class A { } 
    [DataContract]class C : A { } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      A a = new C(); 
      string data; 

      var serializer = new DataContractSerializer(a.GetType()); 
      using (var sw = new StringWriter()) 
      { 
       using (var xw = new XmlTextWriter(sw)) 
        serializer.WriteObject(xw, a); 
       data = sw.ToString(); 
      } 

      serializer = new DataContractSerializer(typeof(A)); 
      using (var sr = new StringReader(data)) 
      using (var xr = new XmlTextReader(sr)) 
       a = (A)serializer.ReadObject(xr); 
     } 
    } 
} 

Tôi đang thiếu gì?

Trả lời

11

Thay đổi cách bạn tạo bộ nối tiếp. Sử dụng:

var serializer = new DataContractSerializer(typeof(A)); 

thay vì a.GetType();

Nó hoạt động. Các Xml được tạo ra là khác nhau - là một cái gì đó như thế này:

<C> ... 

và bây giờ là:

<A i:type="C"> ... 
+1

Cảm ơn rất nhiều! Nó thật sự có hiệu quả. – UserControl