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

C/.NET XML序列化程序-使用属性作为元素名

  •  3
  • anonymous  · 技术社区  · 15 年前

    警告--我不是XML专家。

    以下是我的资料:

    <Fields>
      <Field name="BusinessName" look-up="true">My Business</Field>
      <Field name="BusinessType" look-up="false">Nobody really knows!</Field>
    </Fields>
    

    这将映射回:

    [XmlArrayItem(ElementName = "Field")]
    public List<UserInfoField> Fields;
    

    [Serializable, XmlRoot("Field")]
    public class UserInfoField
    {
        [XmlAttributeAttribute("name")]
        public string Name;
    
        [XmlText]
        public string Value;
    
        [XmlAttributeAttribute("look-up")]
        public bool LookUp;
    }
    

    是否仍要获取此序列化输出:

    <Fields>
      <BusinessName look-up="true">My Business</BusinessName>
      <BusinessType look-up="false">Nobody really knows!</BusinessType>
    </Fields>
    

    我知道这可能太神奇了,可以想象这是一个不应该奏效的好理由…但我想这可能,这是个好地方问:)

    2 回复  |  直到 11 年前
        1
  •  3
  •   jro    15 年前

    XML序列化程序(实际上,所有框架序列化程序)本机序列化类型,而不是名称。属性修饰器让您可以用名称稍微提前了解一下,但是那些是静态的运行时查找,因此它们不允许您使用该结构插入到序列化过程中。

    相反,您要做的是编写自己的序列化例程。这将允许您重写所需的节点命名序列——本质上是将名称字段的属性插入为节点名。您对实现 IXmlSerializable 接口。请记住,这在处理反序列化时也会产生影响。

        2
  •  1
  •   Gustavo Cardoso    11 年前

    您可以同时使用 [马拉雷] [ XMLRAYRAYTIAL ] 属性,如这里所说 http://msdn.microsoft.com/en-us/library/2baksw0z(v=vs.71).aspx

    [XmlArray("Fields")]
    [XmlArrayItem("Field")]
    public List<UserInfoField> Fields;
    

    但是,我建议您对根级别进行序列化:

    <root>
      <Fields>
        <Field name="BusinessName" look-up="true">My Business</Field>
        <Field name="BusinessType" look-up="false">Nobody really knows!</Field>
      </Fields>
    </root>
    

    因此,您将拥有一个包含根和列表的主类,以及元素的另一个类:

    [Serializable, XmlRoot("Root")]
    public class Fields
    {
    
        [XmlArray("Fields")]
        [XmlArrayItem(ElementName = "Field")]
        public List<UserInfoField> Fields;
    }
    
    [Serializable, XmlRoot("Field")]
    public class UserInfoField
    {
        [XmlAttributeAttribute("name")]
        public string Name;
    
        [XmlText]
        public string Value;
    
        [XmlAttributeAttribute("look-up")]
        public bool LookUp;
    }