将基类集合动态地序列化为XML

时间:2014-04-11 09:56:17

标签: c# generics serialization xml-serialization

哦,哈哈,

我想序列化和反对,看起来像这样:

public class Wrapper
{
    [XmlArray("Entities"), XmlArrayItem("Entity")]
    public List<Base> Entities { get; set; }
}

我希望尽可能保持应用程序的灵活性,因此在XmlArrayItem属性中设置手动派生类类型不是一个选项,我该如何动态地执行它,即让序列化器知道所有派生类。

顺便说一下,我已经有了一个类,可以让所有直接派生的类型如BaseDerived.DerivedClassesXmlSerializer cs = new XmlSerializer(this.GetType(),BaseDerived.DerivedClasses);都无效......

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

发现一个灵魂,在序列化过程中你可以直接插入项目属性

首先你收集像

这样的属性
    XmlAttributeOverrides xOver = new XmlAttributeOverrides();
    XmlAttributes xAttrs = new XmlAttributes();
    foreach (var cls in BaseDerived.DerivedClasses)
    {
        var attr = new XmlArrayItemAttribute(cls);
        xAttrs.XmlArrayItems.Add(attr);
    }
    xOver.Add(this.GetType(), BaseDerived.GetMemberName((Wrapper x) => x.Entities), xAttrs);

顺便说一下:

public static string GetMemberName<T, TValue>(Expression<Func<T, TValue>> memberAccess)
{
    return ((MemberExpression)memberAccess.Body).Member.Name;
}

然后你只是在序列化中提到它:

    XmlSerializer cs = new XmlSerializer(this.GetType(), xOver);