2013-01-01 88 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。 –