如何在 C# 中的序列化期间为数组指定属性

本文关键字:数组 属性 序列化 | 更新日期: 2023-09-27 18:19:53

我正在尝试生成创建像这样的XML片段的C#。

<device_list type="list">
    <item type="MAC">11:22:33:44:55:66:77:88</item>
    <item type="MAC">11:22:33:44:55:66:77:89</item>
    <item type="MAC">11:22:33:44:55:66:77:8A</item>
</device_list>

我正在考虑使用这样的东西:

[XmlArray( "device_list" ), XmlArrayItem("item")]
public ListItem[] device_list { get; set; }

作为属性,具有以下类声明:

public class ListItem {
    [XmlAttribute]
    public string type { get; set; }
    [XmlText]
    public string Value { get; set; }
}

这给了我内部序列化,但我不知道如何将 type="list" 属性应用于上面的device_list

我在想(但不确定如何编写语法(我需要做一个:

public class DeviceList {
    [XmlAttribute]
    public string type { get; set; }
    [XmlArray]
    public ListItem[] .... This is where I get lost
}

根据戴夫的回复更新

public class DeviceList : List<ListItem> {
    [XmlAttribute]
    public string type { get; set; }
}
public class ListItem {
    [XmlAttribute]
    public string type { get; set; }
    [XmlText]
    public string Value { get; set; }
}

目前使用情况为:

[XmlArray( "device_list" ), XmlArrayItem("item")]
public DeviceList device_list { get; set; }

和类型,虽然在代码中声明如下:

device_list = new DeviceList{type = "list"}
device_list.Add( new ListItem { type = "MAC", Value = "1234566" } );
device_list.Add( new ListItem { type = "MAC", Value = "1234566" } );

在序列化时未显示类型。这是序列化的结果:

<device_list>
  <item type="MAC">1234566</item>
  <item type="MAC">1234566</item>
</device_list>

所以显然我仍然缺少一些东西...

如何在 C# 中的序列化期间为数组指定属性

使用上面 Dave 的部分答案,我发现最好像这样在声明类中使用属性: (注意缺少属性(

public DeviceList device_list { get; set; }

然后更新设备列表类,如下所示:

[XmlType("device_list")]
[Serializable]
public class DeviceList {
    [XmlAttribute]
    public string type { get; set; }
    [XmlElement( "item" )]
    public ListItem[] items { get; set; }
}

并保留原始列表项类

public class ListItem {
    [XmlAttribute]
    public string type { get; set; }
    [XmlText]
    public string Value { get; set; }
}

我的序列化符合预期:

<device_list type="list">
  <item type="MAC">1234567</item>
  <item type="MAC">123456890</item>
</device_list>

不使用ListItem[],从List<T>派生一个名为 DeviceList 的新类:

public class DeviceList : List<ListItem>
{
   [XmlElement(ElementName = "type")]
   public string ListType {get;set;}
}

然后,在包含类中使用该类序列化 XML。 类型值可以作为父节点的元素包含在内,具体取决于配置序列化的方式。 我不记得确切的语法,但我认为默认情况下类属性是作为节点元素添加的。

包含类:

public class SerializeMyStuff
{
   public SeriazlieMyStuff()
   {
       ListOfDevices = new DeviceList();
       ListOfDevices.ListType = "list";
   }
   [XmlArray( "device_list" ), XmlArrayItem("item")]
   public DeviceList ListOfDevices {get;set;}
}
您还可以

通过在容器类中实现[IXmlSerializable][1]来实现所需的行为:

使用下面的代码,我得到以下标记:

<?xml version="1.0"?>
<DeviceList type="list">
  <Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" type="MAC">11:22:33:44:55:66:77:88</Item>
  <Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" type="MAC">11:22:33:44:55:66:77:89</Item>
  <Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" type="MAC">11:22:33:44:55:66:77:8A</Item>
</DeviceList>

法典:

public class Item
{
    [XmlAttribute("type")]
    public string Type { get; set; }
    [XmlText]
    public string Value { get; set; }
}
public class DeviceList : IXmlSerializable
{
    public string Type { get; set; }
    public List<Item> Items { get; set; } 

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }
    public void ReadXml(System.Xml.XmlReader reader)
    {
        reader.MoveToContent();
    }
    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteAttributeString("type", Type);

        XmlSerializer serializer = new XmlSerializer(typeof(Item));
        foreach (var item in Items)
        {
            serializer.Serialize(writer, item);
        }
    }
}

我在主方法中使用以下代码:

var dlist = new DeviceList
                {
                    Type = "list",
                    Items = new List<Item>
                                {
                                    new Item {Type = "MAC", Value = "11:22:33:44:55:66:77:88"},
                                    new Item {Type = "MAC", Value = "11:22:33:44:55:66:77:89"},
                                    new Item {Type = "MAC", Value = "11:22:33:44:55:66:77:8A"},
                                }
                };

using(FileStream stream = new FileStream(@"D:'jcoletest.xml", FileMode.Create, FileAccess.Write))
{
    new XmlSerializer(typeof (DeviceList)).Serialize(stream, dlist);
}

有关更多信息,请参阅此处的本教程