.net – 如何强制使用xsi:type属性?
如何强制.NET的XmlSerializer将xsi:type =“FooClass”添加到FooClass类型的成员/节点?
该方案是当前发布的应用程序,其中第1版: > FooClass继承FooBaseClass 目标:完全删除FooBaseClass,将FooBaseClass的成员推送到FooClass,同时保持向后序列化兼容性 问题:然后我在Baz.Foo序列化上丢失了xsi:type =“FooClass”属性. 换句话说,XmlSerializer.Serialize的输出 public class BazClass { public BazClass() { Foo = new FooClass { A = 5,B = "Hello" }; } public FooClass Foo { get; set; } } public class FooClass { public int FooPropertyA { get; set; } public string FooPropertyB { get; set; } } 需要是 <Baz> <Foo xsi:type="FooClass"> <FooPropertyA>Hello</FooPropertyA> <FooPropertyB>5</FooPropertyB> </Foo> </Baz> 删除FooBasClass很简单,但是XmlSerializer不再在Baz / Foo上放置xsi:type =“FooClass”,因此v.1 XmlSerializer.Deserialize实例化FooBaseClass实例,而不是设置FooPropertyB,并将其分配给父级的Foo属性巴兹实例.因此,任何检查Baz.Foo是FooClass还是直接转换的代码都会失败. xsi:type属性自动放在v.1代码中 public class BazClass { public BazClass() { Foo = new FooClass { A = 5,B = "Hello" }; } public FooBaseClass Foo { get; set; } } public class FooClass : FooBaseClass { public string FooPropertyB { get; set; } } [XmlInclude(typeof(FooClass))] public class FooBaseClass { public int FooPropertyA { get; set; } } 我认为简短的答案是你不能 – 至少没有实现I(Xml)Serializable或编写自定义序列化代码.但是,我愿意接受好的建议.同时我已经在下面实现了一个解决方法hack,并希望有更优雅的东西,或者至少允许我以某种方式完全删除FooBaseClass. BazClass { [XmlElement("Foo")] public FooBaseClass XmlFoo { get { return Foo; } set { Foo = (StartPicture)value; } } [XmlIgnore] public FooClass Foo { get; set; } } FooClass : FooBaseClass { public int FooPropertyB { get; set; } public string FooPropertyA { get; set; } } [XmlInclude("FooClass")] FooBaseClass { }
XmlSerializer有时会非常愚蠢和简单,在这种情况下,这对您有利.只需手动将它放在那里:
public class FooClass { public int FooPropertyA { get; set; } public string FooPropertyB { get; set; } [XmlAttribute("type",Namespace="http://www.w3.org/2001/XMLSchema-instance")] public string XsiType { get { return "Foo"; } set { } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- iOS8使用Interface Builder自行调整静态TableView单元格大小
- 如何遍历目录并仅使用C#通过Web方法返回文件夹名称?
- C++中输出十六进制形式的字符串
- swift3 – Swift 3中的String(data:x,encoding:NSUTF8Str
- ruby-on-rails – 让Puma Postgres服务器在开发中工作以与H
- ruby-on-rails – Rails太阳黑子:多个模型搜索,但只有某个
- PostgreSQL启动过程中的那些事七:初始化共享内存和信号十三
- SqlMapConfig.xml配置文件详解
- NoSQL_MongoDB_MongoDB数据类型
- 浅析DDD(领域驱动设计)