【问题标题】:How do you deserialize a collection with child collections?你如何反序列化带有子集合的集合?
【发布时间】:2008-11-19 01:33:25
【问题描述】:

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

自定义实体是可序列化的,集合属性标记有以下属性:[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 也是如此。

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

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

【问题讨论】:

    标签: c# web-services serialization


    【解决方案1】:

    根据您的具体操作,有多种选择...调查 System.Xml.Serialization 命名空间中的 Xml 属性...特别是,请查看

    [XmlArrayItem(ElementName = "")]

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

    在这个命名空间中有一大堆 Xml 属性,您可以使用它们来精确控制序列化和反序列化的发生方式。您可以通过使用正确的 Xml*Atttributes 进行适当的装饰来创建几乎任何您想要的类结构

    【讨论】:

    • 我确实有 XmlArrayItem 标签 - 我想知道字节数组的“ArrayList”是否是问题。
    • 感谢查尔斯的努力。问题最终不在于我的序列化,使这个问题“有点”难以回答,而在于属性本身。很抱歉,再次感谢您的努力。
    【解决方案2】:

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

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

    一旦为 ArrayList 属性编写了一个 setter,并且在整个 Add 方法中对逻辑进行了一些调整,序列化就可以工作了。

    课程:对于需要基于序列化流重构的可序列化类,所有序列化属性都必须是可写的——当你这么说的时候,有点明显。

    【讨论】:

    • 事实上,这一直是我的一个长期抱怨......我不太确定它是否明显。在你的列表中设置一个 setter 并不是一个好习惯——通常你希望人们使用“.Items.Add”等,而不是“.Items =”(也许数组除外)。
    • 我在 .NET 中使用 xml 序列化已经有很长一段时间了,但这仍然有点问题。顺便说一句 - 你可能不应该使用 ArrayList 这么多......更喜欢 List 在任何 2.0 或更高版本中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2013-05-05
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多