[英]XML Serialization / Deserialization of List in c#
我有這樣的類結構:
public List<EndpointInfo> EndpointInfoList = new List<EndpointInfo> ();
[Serializable]
public class EndpointInfo
{
public List<PairedEndpoint> PairedEndpoints { get; set; }
public EndpointInfo ()
{
PairedEndpoints = new List<PairedEndpoint> ();
}
}
public class PairedEndpoint
{
public List<int> ConnectedChannels { get; set; }
public PairedEndpoint ()
{
ConnectedChannels = new List<int>();
}
}
我希望生成的XML看起來像這樣
<?xml version="1.0"?>
<ArrayOfEndpointInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<EndpointInfo>
<PairedEndpoints>
<PairedEndpoint>
<ConnectedChannels>
<ConnectedChannel>1</ConnectedChannel>
<ConnectedChannel>2</ConnectedChannel>
</ConnectedChannels>
</PairedEndpoint>
<PairedEndpoint>
<ConnectedChannels>
<ConnectedChannel>3</ConnectedChannel>
<ConnectedChannel>4</ConnectedChannel>
</ConnectedChannels>
</PairedEndpoint>
</PairedEndpoints>
</EndpointInfo>
</ArrayOfEndpointInfo>
但是,我真的不知道應該如何序列化PairedEndpoints來創建其中的通道列表。 我將不勝感激任何幫助。
嘗試這個 :
public class ArrayOfEndpointInfo
{
[XmlElement(ElementName = "EndpointInfo")]
public EndpointInfo EndPointInfo { get; set; }
}
public class EndpointInfo
{
[XmlArray(ElementName = "PairedEndpoints")]
public List<PairedEndpoint> PairedEndpoints { get; set; }
}
public class PairedEndpoint
{
[XmlArrayItem(ElementName="ConnectedChannel")]
public List<int> ConnectedChannels { get; set; }
}
然后:
var t = new XmlSerializer(typeof(ArrayOfEndpointInfo));
var result = t.Deserialize(new StreamReader("path"));
public class ProcessXml
{
public void ReadXml()
{
var xml = "<ArrayOfEndpointInfo xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +
@"<EndpointInfo>
<PairedEndpoints>
<PairedEndpoint>
<ConnectedChannels>
<ConnectedChannel>1</ConnectedChannel>
<ConnectedChannel>2</ConnectedChannel>
</ConnectedChannels>
</PairedEndpoint>
<PairedEndpoint>
<ConnectedChannels>
<ConnectedChannel>3</ConnectedChannel>
<ConnectedChannel>4</ConnectedChannel>
</ConnectedChannels>
</PairedEndpoint>
</PairedEndpoints>
</EndpointInfo>
</ArrayOfEndpointInfo>";
var serializer = new XmlSerializer(typeof(ArrayOfEndpointInfo));
serializer.UnknownNode += Serializer_UnknownNode;
serializer.UnknownAttribute += Serializer_UnknownAttribute;
var result = serializer.Deserialize(GenerateStreamFromString(xml)) as ArrayOfEndpointInfo;
WriteXml(result);
}
public void WriteXml(ArrayOfEndpointInfo info)
{
var writer = XmlWriter.Create(@"D:\temp\myXml.xml");//Here you can use different overload to get xml in variable, eg. TextWriter etc.
var serializer = new XmlSerializer(typeof(ArrayOfEndpointInfo));
serializer.Serialize(writer, info);
writer.Close();
}
private static void Serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
Console.WriteLine("Unknown Nodes: {0}\t{1}", e.Name, e.Text);
}
private static void Serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{
Console.WriteLine("Unknown Attributes: {0}\t{1}", e.Attr.Name, e.Attr.Value);
}
public Stream GenerateStreamFromString(string s)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
}
模型類是:
[XmlRoot(ElementName = "ConnectedChannels")]
public class ConnectedChannels
{
[XmlElement(ElementName = "ConnectedChannel")]
public List<string> ConnectedChannel { get; set; }
}
[XmlRoot(ElementName = "PairedEndpoint")]
public class PairedEndpoint
{
[XmlElement(ElementName = "ConnectedChannels")]
public ConnectedChannels ConnectedChannels { get; set; }
}
[XmlRoot(ElementName = "PairedEndpoints")]
public class PairedEndpoints
{
[XmlElement(ElementName = "PairedEndpoint")]
public List<PairedEndpoint> PairedEndpoint { get; set; }
}
[XmlRoot(ElementName = "EndpointInfo")]
public class EndpointInfo
{
[XmlElement(ElementName = "PairedEndpoints")]
public PairedEndpoints PairedEndpoints { get; set; }
}
[XmlRoot(ElementName = "ArrayOfEndpointInfo")]
public class ArrayOfEndpointInfo
{
[XmlElement(ElementName = "EndpointInfo")]
public EndpointInfo EndpointInfo { get; set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.