复杂对象的反序列化#
deserialization of complex object c#
我正在尝试反序列化 xml 中的一个深度嵌套的对象。
这是 xml 代码:
<modules>
<channel>
<resources>
<resource name="x" refresh_interval="180">... text ...</resource>
<resource name="y" refresh_interval="180">..text..</resource>
<resource name="z" refresh_interval="180">... text ...</resource>
</resources>
</channel>
</modules>
我在模块节点中有更多元素,例如通道,但我希望对于示例来说,这个就足够了。
然后我有我的 class:
public class IdentifyData{
public Modules modules;
}
public class Modules
{
public List<Resources> channels;
}
public class Resources
{
[DataMember(Name = "name")]
public string name { get; set; }
[DataMember(Name ="url")]
public string url { get; set; }
[DataMember(Name = "refresh_interval")]
public string refresh_interval { get; set; }
}
我尝试了 XmlArray 和所有东西,但它就是不想工作,当然我搜索了整个堆栈溢出,但找不到正确的答案。
如果一个响应中没有多个模块,并且一个模块中没有多个图像或频道,那么以下 classes 将适用于您。
您可以使用 Image 和 Channel 继承自的基 class 以及一些其他属性进一步简化此 class 结构:
[Serializable]
[XmlRoot("response")]
public class IdentifyData
{
[XmlElement("modules")]
public Modules modules { get; set; }
}
[Serializable]
public class Modules
{
[XmlElement]
public Channel channel { get; set; }
[XmlElement]
public Image image { get; set; }
}
[Serializable]
public class Image
{
[XmlArray("resources")]
[XmlArrayItem("resource")]
public List<Resources> resources { get; set; }
}
[Serializable]
public class Channel
{
[XmlArray("resources")]
[XmlArrayItem("resource")]
public List<Resources> resources { get; set; }
}
[Serializable]
public class Resources
{
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public string url { get; set; }
[XmlAttribute]
public string refresh_interval { get; set; }
[XmlText]
public string someText { get; set; }
}
然后像这样反序列化它:
using (var sr = new StreamReader("data.xml"))
{
var xs = new XmlSerializer(typeof(IdentifyData));
var responseData = (IdentifyData)xs.Deserialize(sr);
Console.WriteLine("Got {0} channel resources", responseData.modules.channel.resources.Count);
}
我正在尝试反序列化 xml 中的一个深度嵌套的对象。
这是 xml 代码:
<modules>
<channel>
<resources>
<resource name="x" refresh_interval="180">... text ...</resource>
<resource name="y" refresh_interval="180">..text..</resource>
<resource name="z" refresh_interval="180">... text ...</resource>
</resources>
</channel>
</modules>
我在模块节点中有更多元素,例如通道,但我希望对于示例来说,这个就足够了。 然后我有我的 class:
public class IdentifyData{
public Modules modules;
}
public class Modules
{
public List<Resources> channels;
}
public class Resources
{
[DataMember(Name = "name")]
public string name { get; set; }
[DataMember(Name ="url")]
public string url { get; set; }
[DataMember(Name = "refresh_interval")]
public string refresh_interval { get; set; }
}
我尝试了 XmlArray 和所有东西,但它就是不想工作,当然我搜索了整个堆栈溢出,但找不到正确的答案。
如果一个响应中没有多个模块,并且一个模块中没有多个图像或频道,那么以下 classes 将适用于您。 您可以使用 Image 和 Channel 继承自的基 class 以及一些其他属性进一步简化此 class 结构:
[Serializable]
[XmlRoot("response")]
public class IdentifyData
{
[XmlElement("modules")]
public Modules modules { get; set; }
}
[Serializable]
public class Modules
{
[XmlElement]
public Channel channel { get; set; }
[XmlElement]
public Image image { get; set; }
}
[Serializable]
public class Image
{
[XmlArray("resources")]
[XmlArrayItem("resource")]
public List<Resources> resources { get; set; }
}
[Serializable]
public class Channel
{
[XmlArray("resources")]
[XmlArrayItem("resource")]
public List<Resources> resources { get; set; }
}
[Serializable]
public class Resources
{
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public string url { get; set; }
[XmlAttribute]
public string refresh_interval { get; set; }
[XmlText]
public string someText { get; set; }
}
然后像这样反序列化它:
using (var sr = new StreamReader("data.xml"))
{
var xs = new XmlSerializer(typeof(IdentifyData));
var responseData = (IdentifyData)xs.Deserialize(sr);
Console.WriteLine("Got {0} channel resources", responseData.modules.channel.resources.Count);
}