gpt4 book ai didi

.net - 如何强制使用 xsi :type attribute?

转载 作者:行者123 更新时间:2023-12-03 07:49:40 24 4
gpt4 key购买 nike

如何强制 .NET 的 XmlSerializer 将 xsi:type="FooClass" 添加到 FooClass 类型的成员/节点?

该场景是当前发布的应用程序,在 v.1 中:

  • FooClass继承FooBaseClass
  • FooPropertyA 位于 FooBaseClass
  • FooPropertyB 位于 FooClass 上
  • FooBaseClass 用 [XmlIninclude(typeof(FooClass))] 装饰
  • BazClass 具有 FooBaseClass 类型的成员 Foo
  • Baz.Foo 的所有集合都是 FooClass 实例
  • Baz.Foo 的所有用法都需要 FooPropertyB(因此 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 不再将 xsi:type="FooClass"放在 Baz/Foo 上,因此 v.1 XmlSerializer.Deserialize 实例化 FooBaseClass 实例,而不是设置 FooPropertyB,并将其分配给 Foo 属性父 Baz 实例的。因此,任何检查 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)Serialized 或编写自定义序列化代码的情况下不能。不过,我愿意接受好的建议。同时,我在下面实现了一个解决方法 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 { }
}
}

关于.net - 如何强制使用 xsi :type attribute?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1943597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com