我想序列化和反对,看起来像这样:
public class Wrapper
{
[XmlArray("Entities"), XmlArrayItem("Entity")]
public List<Base> Entities { get; set; }
}
我希望尽可能保持应用程序的灵活性,因此在XmlArrayItem属性中设置手动派生类类型不是一个选项,我该如何动态地执行它,即让序列化器知道所有派生类。
顺便说一下,我已经有了一个类,可以让所有直接派生的类型如BaseDerived.DerivedClasses
和XmlSerializer cs = new XmlSerializer(this.GetType(),BaseDerived.DerivedClasses);
都无效......
有什么想法吗?
答案 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);