2013-01-01 92 views
0

我有包含接口成員variable.How我可以反序列化這個類的類反序列化類接口

interface ISensor { } 

[Serializable] 
class Sensor: ISensor { } 

[Serializable] 
class Root 
{ 
    [XmlElement("Sensor")] 
    public List<ISensor> SensorList{ get; set; } 
} 

我的XML會是這樣

<?xml version="1.0" encoding="us-ascii"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Sensor > 
     <SensorName>Name1</SensorName> 
     <SensorValue>0.0</SensorValue> 
    </Sensor> 
    <Sensor> 
     <SensorName>Name2</SensorName> 
     <SensorValue>148.00</SensorValue> 
    </Sensor> 
</Root> 
+3

可能重複:http://stackoverflow.com/questions/1333864/xml-serialization-of -interface-property – Ngm

+0

你使用了哪個序列化程序? –

+0

我使用了XmlSerializer –

回答

1

假設你正在使用XmlSerializer ,序列化和反序列化都需要兩個更改:

  1. 告訴串行器可以出現的類型列表,換句話說,從Sensor繼承的類型。
  2. 使用列表而不是界面,換句話說用List<Sensor>代替List<ISensor>

不幸的是,XmlSerializer不能以你想要的方式處理接口。有關更多信息,請參閱XmlSerializer serialize generic List of interface

如果使用基類不是選項您可以通過執行IXmlSerializable來編寫自己的XML序列化程序。覆蓋ReadXml並手動解析XML。

例如:

public interface ISensor { } 

[Serializable] 
public class Sensor : ISensor { } 

[Serializable] 
public class Root 
{ 
    // Changed List<ISensor> to List<Sensor>. I also changed 
    // XmlElement to XmlArray so it would appear around the list.  
    [XmlArray("Sensor")] 
    public List<Sensor> SensorList { get; set; } 
} 

[Serializable] 
public class SensorA : Sensor 
{ 
    [XmlElement("A")] 
    public string A { get; set; } 
} 

[Serializable] 
public class SensorB : Sensor 
{ 
    [XmlElement("B")] 
    public string B { get; set; } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     XmlSerializer xmlSerializer; 

     Root root = new Root(); 
     root.SensorList = new List<Sensor>(); 
     root.SensorList.Add(new SensorA() {A = "foo"}); 
     root.SensorList.Add(new SensorB() {B = "bar"}); 

     // Tell the serializer about derived types 
     xmlSerializer = new XmlSerializer(typeof (Root), 
      new Type[]{typeof (SensorA), typeof(SensorB)}); 
     StringBuilder stringBuilder = new StringBuilder(); 
     using (StringWriter stringWriter = new StringWriter(stringBuilder)) 
     { 
      xmlSerializer.Serialize(stringWriter, root); 
     } 

     // Output the serialized XML 
     Console.WriteLine(stringBuilder.ToString()); 

     Root root2; 
     using (StringReader stringReader = new StringReader(stringBuilder.ToString())) 
     { 
      root2 = (Root) xmlSerializer.Deserialize(stringReader); 
     } 
    } 
} 

從Console.WriteLine命令語句的輸出是:

<?xml version="1.0" encoding="utf-16"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Sensor> 
    <Sensor xsi:type="SensorA"> 
     <A>foo</A> 
    </Sensor> 
    <Sensor xsi:type="SensorB"> 
     <B>bar</B> 
    </Sensor> 
    </Sensor> 
</Root> 
+0

我怎麼做反序列化 –

+0

我已經更新了答案和示例來討論反序列化,雖然所需的更改是相同的。你有什麼需要具體嗎? – akton

+1

對於我的情況,我將無法更改XML的格式(請在問題中檢查XML)。我需要反序列化該XMl。 –