如何序列化继承自List将自定义参数设置为XML

本文关键字:自定义 参数 设置 XML 序列化 继承 List | 更新日期: 2023-09-27 18:11:32

我有一个继承自List的类

[Serializable]
public class ListWithVersion<T> : List<T>
{
    [XmlElement(ElementName = "version")]
    public int version;
    public ListWithVersion(IEnumerable<T> collection) : base(collection)
    {
    }
    public ListWithVersion() : base()
    {
    }
}

然后序列化成这样的XML

ListWithVersion<Chapter> lwv = new ListWithVersion<Chapter>();
        Chapter chapter = new Chapter();
        chapter.dialogs = new List<Dialog>();
        lwv.version = 1;
        lwv.Add(chapter);
        Serialize("lwv.xml", typeof(ListWithVersion<Chapter>), extraTypes, lwv);
    private void Serialize(string name, Type type, Type[] extraTypes, object obj)
    {
        try
        {
            var serializer = new XmlSerializer(type, extraTypes);
            using (var fs = new FileStream(GetPathSave() + name, FileMode.Create, FileAccess.Write))
            {
                serializer.Serialize(fs, obj);
            }
        }
        catch (XmlException e)
        {
            Debug.LogError("serialization exception, " + name + " Message: " + e.Message);
        }
        catch (System.Exception ex)
        {
            Debug.LogError("exc while ser file '" + name + "': " + ex.Message);
            System.Exception exc = ex.InnerException;
            int i = 0;
            while (exc != null)
            {
                Debug.LogError("inner " + i + ": " + exc.Message);
                i++;
                exc = exc.InnerException;
            }
        }
    }

但是XML文件不包含version参数。

<?xml version="1.0" encoding="windows-1251"?>
<ArrayOfChapter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Chapter id="0">
    <dialogs />
  </Chapter>
</ArrayOfChapter>

(version="1.0"不是我的参数)

我尝试过XmlAttribute而不是XmlElement,也尝试过raw

public int version;

在XML中获取版本参数没有任何帮助。

那么我该如何修复它呢?

如何序列化继承自List<T>将自定义参数设置为XML

您不能直接这样做,因为XmlSerializerICollection<T>的对象有一个特殊的处理(正如您所注意到的),它几乎忽略了类,只是序列化它的内容。两个选择:

  • 实现IXmlSerializable,自己序列化。
  • 修改你的类,使其具有List<T>类型的成员,而不是从它继承。
编辑:我将在这里回答你的评论,因为使用格式化的文本更容易。你可以这样做,但这可能需要两种方法的混合。
    在你的类中有一个私有的List<T>
  1. 让你的类实现IList<T>而不是List<T>。使用私有列表实现所有接口成员,类似于:

public void Add(T item) => this.list.Add(item);
public void Clear() => this.list.Clear();
[...]
  • 实现IXmlSerializable -首先编写自己的变量,然后使用私有列表输出其他所有内容