如何使用子集合反序列化集合?

时间:2008-11-19 01:33:25

标签: c# web-services serialization

我有一组自定义实体对象,其中一个属性是字节数组的ArrayList

自定义实体是可序列化的,并且collection属性标有以下属性:[XmlArray("Images"), XmlArrayItem("Image",typeof(byte[]))]

所以我序列化了这些自定义实体的集合,并将它们作为字符串传递给Web服务。

Web服务接收字符串和字节数组

然后,下面的代码尝试反序列化集合 - 返回自定义实体进行处理......

XmlSerializer ser = new XmlSerializer(typeof(List<myCustomEntity>));
StringReader reader = new StringReader(xmlStringPassedToWS);
List<myCustomEntity> entities = (List<myCustomEntity>)ser.Deserialize(reader);

foreach (myCustomEntity e in entities)
{
    // ...do some stuff...

    foreach (myChildCollection c in entities.ChildCollection
    {
        // .. do some more stuff....
    }
}

我检查了初始序列化产生的XML,它确实包含字节数组 - 子集合,以及上面构建的StringReader。

在反序列化过程之后,生成的自定义entites集合很好,除了集合中的每个对象都不包含其子集合中的任何项目。 (即上面没有“......做更多的东西......”。

有人可以解释一下我做错了什么吗?是否可以在自定义实体的通用集合中序列化ArrayLists?

2 个答案:

答案 0 :(得分:2)

根据您正在做的事情,有多种选择...调查System.Xml.Serialization命名空间中的Xml属性...特别是,请查看

[XmlArrayItem(ElementName =“”)]

这是一个类的属性,它被类型化为某种类型的集合(我认为它需要实现IList),并且将由XmlDeserializer填充,其中Xml元素名为“ElementName”......

此命名空间中有一大堆Xml属性可用于精确控制序列化和反序列化的发生方式。您可以通过适当的装饰使用正确的Xml * Atttributes

创建您想要的任何类结构

答案 1 :(得分:0)

要序列化的可序列化类的属性必须是读/写。

在上面的例子中,ArrayList属性是只读的,它是基于一个单独的函数返回字节数组的,其中添加了文件名。

一旦为ArrayList属性编写了一个setter,并且整个Add方法中的逻辑稍微调整了一下,序列化就可以了。

课程:对于需要根据序列化流重构的可序列化类,所有序列化属性都需要是可写的 - 当你说它时,有点明显。