gpt4 book ai didi

c# - XmlSerializer - 忽略继承的不可序列化成员

转载 作者:行者123 更新时间:2023-12-02 04:52:30 26 4
gpt4 key购买 nike

假设您有两个类,一个继承另一个,子类需要使用 XmlSerializer 进行序列化/反序列化。但是,父级包含一个不可序列化的成员,比如字典。

public class Parent {

public Dictionary<string, int> dictionary;
}

父类是用于许多其他脚本的库。它不能被修改。现在子类只包含可序列化的成员:

public class Child : Parent {

[XmlElement]
public int foo;

}

尝试调用序列化程序时,我收到一条错误消息,指出字典不可序列化。当尝试在 JSON 中序列化时,我设法以警告的代价逃脱了。我刚刚创建了另一个具有相同名称和类型的成员,并使用了 ScriptIgnore:

public class Child : Parent {

public int foo;

[ScriptIgnore]
public Dictionary<string, int> dictionary;

}

我在这里再次尝试了相同的技巧(通过使用 XmlIgnore),但效果不佳,错误是相同的。我设法完成此操作的唯一方法是创建单独的类,这些类将仅服务于 xml 反序列化,然后将值复制回适当的位置。

有没有人知道更好的解决方法?我可以让 XmlSerializer 以任何方式忘记父字典吗?

最佳答案

我要说的第一件事,并且总是说:如果序列化现有模型变得棘手 - 甚至有点尴尬,那么停止这样做。花 2 分钟时间创建一个单独的 DTO 模型,即专为序列化目的而创建的模型(实际上,甚至可能为特定的序列化程序量身定制)。现在您放置了完全正确的类型、正确的成员、正确的属性和正确的布局。您需要做的就是添加一些转换方法——静态转换运算符在这里工作得很好。所以我要说的是:创建一个 ParentDtoChildDto(你的名字可能不同);只需 3 分钟,效果会很好。

现在,回到问题...

XmlSerializer 查看输入的声明类;对于属性和条件序列化,不:我们现在不能将它们添加到类型模型中。但还有另一种选择 - 您可以使用 XmlAttributeOverrides 假装字典成员上有一个 [XmlIgnore]。但是,一些重要的警告:

  • XmlAttributeOverrides API 使用起来有点麻烦(有关示例,请参见 MSDN)
  • 关键您只执行此操作一次,然后存储并重新使用XmlSerializer您以这种方式创建;基本上,如果您这样做,每次您新建序列化程序时,它都会创建一个新的动态程序集,并且程序集永远不会卸载,所以你会失忆;请注意,简单 用法(new XmlSerializer(someType) 等)为此具有内置缓存;但 XmlAttributeOverrides 用法不会

但同样,所有这些与 XmlAttributeOverrides 的困惑比仅仅创建一个基本的 DTO

要多得多

使用 XmlAttributeOverrides 的示例:

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
public class Parent {
public Dictionary<string, int> WantToIgnoreThis { get; set; }
}
public class Child : Parent {
public int Foo { get; set; }
}
static class Program
{
static readonly XmlSerializer customSerializer;

static Program()
{
var xao = new XmlAttributeOverrides();
xao.Add(typeof(Parent), "WantToIgnoreThis", new XmlAttributes {
XmlIgnore = true
});
customSerializer = new XmlSerializer(typeof(Child), xao);
}
static void Main()
{
//var ser = new XmlSerializer(typeof(Child));
// ^^ this would fail

customSerializer.Serialize(Console.Out, new Child {
Foo = 123
});
}
}

请特别注意 static 字段如何用于缓存序列化程序。

关于c# - XmlSerializer - 忽略继承的不可序列化成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18588083/

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