c# - 用数组名称包装序列化数组元素

标签 c# .net xml visual-studio-2008 xml-serialization

我正在使用 VSTS2008 + C# + .Net 3.0。我正在使用下面的代码序列化 XML,我的对象包含数组类型属性,我想添加一个额外的元素层(下面预期结果中的“MyInnerObjectProperties”元素层,我想将“MyInnerObjectProperties”元素作为父元素所有 MyInnerObjectProperty 元素的元素)。有什么想法吗?

当前序列化的 XML,

<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyObjectProperty>
    <MyInnerObjectProperty>
      <ObjectName>Foo Type</ObjectName>
    </MyInnerObjectProperty>
    <MyInnerObjectProperty>
      <ObjectName>Goo Type</ObjectName>
    </MyInnerObjectProperty>
  </MyObjectProperty>
</MyClass>

预期的序列化 XML,

<?xml version="1.0"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MyObjectProperty>
    <MyInnerObjectProperties>
      <MyInnerObjectProperty>
        <ObjectName>Foo Type</ObjectName>
      </MyInnerObjectProperty>
      <MyInnerObjectProperty>
        <ObjectName>Goo Type</ObjectName>
      </MyInnerObjectProperty>
    </MyInnerObjectProperties>
  </MyObjectProperty>
</MyClass>

当前代码,

public class MyClass
{
    private MyObject[] _myObjectProperty;

    [XmlElement(IsNullable=false)]
    public MyObject[] MyObjectProperty
    {
        get
        {
            return _myObjectProperty;
        }
        set
        {
            _myObjectProperty = value;
        }
    }
}
public class MyObject
{
    private MyInnerObject[] _myInnerObjectProperty;

    [XmlElement(IsNullable = false)]
    public MyInnerObject[] MyInnerObjectProperty
    {
        get
        {
            return _myInnerObjectProperty;
        }
        set
        {
            _myInnerObjectProperty = value;
        }
    }
}

public class MyInnerObject
{
    public string ObjectName;
}

public class Program
{
    static void Main(string[] args)
    {
        XmlSerializer s = new XmlSerializer(typeof(MyClass));
        FileStream fs = new FileStream("foo.xml", FileMode.Create);
        MyClass instance = new MyClass();
        instance.MyObjectProperty = new MyObject[1];
        instance.MyObjectProperty[0] = new MyObject();
        instance.MyObjectProperty[0].MyInnerObjectProperty = new MyInnerObject[2];
        instance.MyObjectProperty[0].MyInnerObjectProperty[0] = new MyInnerObject();
        instance.MyObjectProperty[0].MyInnerObjectProperty[0].ObjectName = "Foo Type";
        instance.MyObjectProperty[0].MyInnerObjectProperty[1] = new MyInnerObject();
        instance.MyObjectProperty[0].MyInnerObjectProperty[1].ObjectName = "Goo Type";

        s.Serialize(fs, instance);

        return;
    }
}

最佳答案

利用XmlArrayItemAttribute

[XmlArray("MyInnerObjectProperties")]     
[XmlArrayItemAttribute("MyInnerObjectProperty", typeof(MyInnerObject),  IsNullable = false)]
public MyInnerObject[] MyInnerObjectProperty
{
   get
     {
         return _myInnerObjectProperty;
     }
   set
     {
        _myInnerObjectProperty = value;
     }
}

关于c# - 用数组名称包装序列化数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1227897/

相关文章:

c# - 如何将默认参数值设置为 BigInteger 类型?

c# - 实体或复杂类型...无法在 LINQ to Entities 查询中构造

.NET Framework 4客户端配置文件+ System.Web.dll?

c# - 如何在 N :N relationships? 上触发 MS Dynamic CRM 中的插件

regex - 结合删除标签正则表达式和删除 sed 中的空行 - Unix

InfoPath 表单中的 C# 字符串插值

c# - 如何使用 Fluent Validator 在 RuleForEach 验证消息中返回特定属性?

.net - Visual Git 208 加载项无法在 Windows 7/Visual Studio 2010 下运行

xml - 从 Cocoa 应用程序读取并解析 XML 文件

java - 将带有索引的属性列表转换为对象的 Xml