代码之家  ›  专栏  ›  技术社区  ›  Tim

用内部修饰符声明的类的序列化列表<>

  •  5
  • Tim  · 技术社区  · 15 年前

    我正在尝试将XML序列化添加到C中一个相当普通的类结构中。本质上,根类有一个单独的实例(称为a class),它包含一些其他类的实例列表(称为anotherclass):

    [XmlRoot("RootNode")]
    public class AClass {
        [XmlElement("ListNode")]
        internal List otherObjects { get; set; }
    }
    
    public class AnotherClass {
        [XmlAttribute("Name")]
        internal string name { get; set; }
    }

    序列化时,我希望这两个类都序列化在一起——也就是说,如果我序列化aclass,它的另一个类列表也将被序列化(请参见 this question )

    我大部分时间都在工作,但问题是在序列化过程中,XmlSerializer似乎只想处理 public 类的属性-如果声明了列表,则它根本不序列化其他类 internal .

    我试图让序列化程序看到程序集的内部:

    [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Xml")]

    好像什么都没做。有没有一种方法可以让XmlSerializer递归序列化声明为内部的对象列表?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Thomas Levesque    15 年前

    你走对了…除了实际的序列化不是由System.xml执行,而是由动态生成的程序集执行。无法预测该程序集的名称(它是随机生成的),因此不能在 InternalsVisibleTo 属性。

    唯一的解决方案是预生成XML序列化程序集。你可以用 XML Serializer Generator Tool (Sgen.exe) . 生成的程序集的名称将是“yourasassembly.xmlserializers”;这是必须在 内部可见到 属性。

        2
  •  1
  •   Paolo Tedesco    15 年前

    添加 InternalsVisibleTo 属性是一个很好的属性,但我认为问题在于XML序列化代码只在程序集中查找公共类型。
    据我所知,无法使XmlSerializer序列化或反序列化内部类型,您必须将这些类型声明为公共类型或编写自己的序列化代码。
    此外, XmlSerializer class documentation 显式地声明,只有对象的公共属性才会被序列化:“XML序列化是将对象的公共属性和字段转换为用于存储或传输的串行格式(在本例中是XML)的过程”,因此它看起来确实像是一个设计决策。