我有一组自定义实体对象,其中一个属性是字节数组的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?
答案 0 :(得分:2)
根据您正在做的事情,有多种选择...调查System.Xml.Serialization命名空间中的Xml属性...特别是,请查看
[XmlArrayItem(ElementName =“”)]
这是一个类的属性,它被类型化为某种类型的集合(我认为它需要实现IList),并且将由XmlDeserializer填充,其中Xml元素名为“ElementName”......
此命名空间中有一大堆Xml属性可用于精确控制序列化和反序列化的发生方式。您可以通过适当的装饰使用正确的Xml * Atttributes
创建您想要的任何类结构答案 1 :(得分:0)
要序列化的可序列化类的属性必须是读/写。
在上面的例子中,ArrayList属性是只读的,它是基于一个单独的函数返回字节数组的,其中添加了文件名。
一旦为ArrayList属性编写了一个setter,并且整个Add方法中的逻辑稍微调整了一下,序列化就可以了。
课程:对于需要根据序列化流重构的可序列化类,所有序列化属性都需要是可写的 - 当你说它时,有点明显。