代码之家  ›  专栏  ›  技术社区  ›  Stuart Helwig

如何反序列化包含子集合的集合?

  •  1
  • Stuart Helwig  · 技术社区  · 17 年前

    我有一组自定义实体对象,其中一个属性是 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?

    2 回复  |  直到 17 年前
        1
  •  2
  •   Charles Bretana    17 年前

    根据你正在做的事情,有各种各样的选择。..调查系统中的Xml属性。Xml。序列化命名空间。..特别是,看看

    [XmlArrayItem(元素名称=“”)]

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

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

        2
  •  0
  •   Stuart Helwig    17 年前

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

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

    一旦为ArrayList属性编写了一个设置器,并在整个Add方法中稍微调整了逻辑,序列化就可以工作了。

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