2013-06-18 91 views
2

我想在這個例子中序列化父對象像序列化父對象的

static void Main(string[] args) 
    { 
     Child child = new Child 
      { 
       Id = 5, 
       Name = "John", 
       Address = "Address" 
      }; 

     Parent parent = child; 

     XmlSerializer serializer =new XmlSerializer(typeof(Parent)); 
     Stream stream=new MemoryStream(); 

     serializer.Serialize(stream,parent); //this line throws exception 

     Parent p2 = (Parent) serializer.Deserialize(stream); 

     Console.ReadKey(); 
    } 
} 

[Serializable] 
public class Parent 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

[Serializable] 
public class Child : Parent 
{ 
    public string Address { get; set; } 
} 

是我得到的異常文本是「沒有預期的類型CastParrentExample.Child。使用XmlInclude或SoapInclude屬性來指定靜態未知的類型。「 我想要達到的是得到真正的父類對象沒有子類字段。

+1

您沒有通過分配引用來獲得「真正的」父對象。您將不得不創建一個新的Parent對象,並從Child對象的相應屬性中分配其屬性。更好的是通過XML來實現而不是通過XML序列化,而不是讓XML序列化器在反序列化時忽略序列化對象的實際類型(通過xsi:type指定的XML)很容易。 –

+0

[How to XML serialize child class with its base class](http://stackoverflow.com/questions/4943360/how-to-xml-serialize-child-class-with-its-base-class) – svick

+0

「你將不得不創建一個新的Parent對象,並從Child對象的相應屬性中分配它的屬性。」你能推薦一個簡單的方法來爲一個巨大的課程做到這一點嗎?反思也許? – Milos

回答

2

你需要添加[XmlInclude(typeof(Child))]到父類,如:

[XmlInclude(typeof(Child))] 
public class Parent 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

或使用下面的代碼在初始化XmlSeralializer:

XmlSerializer serializer =new XmlSeralializer(typeof(Parent), new[] {typeof(Child)}) 

爲更好地理解,請參閱How to XML serialize child class with its base class

2

在父類添加屬性

[XmlInclude(typeof(Child))] 
class Parent { 
...