gpt4 book ai didi

c# - 如何序列化包含接口(interface)的不可修改类?

转载 作者:行者123 更新时间:2023-11-30 15:35:56 25 4
gpt4 key购买 nike

我正在尝试序列化一个包含接口(interface)的对象。但是,接口(interface)不能序列化。通常,我会使用类似 NonSerialized 的东西标记,但我不知道如何将此属性应用于我无法修改的类,例如预定义的 .NET 类之一(例如:System.Diagnostics.Process)。

例如,考虑以下代码:

using System.Diagnostics
using System.Xml.Serialization;

class Program
{
static void Main(string[] args)
{
try
{
XmlSerializer x = new XmlSerializer(typeof(Process));
}
catch (Exception e)
{
Console.WriteLine(e.InnerException.InnerException.Message);
}
}
}

这将打印以下结果:

Cannot serialize member System.ComponentModel.Component.Site of type System.ComponentModel.ISite because it is an interface.

有没有办法在我无法修改的类(例如系统类)中执行以下任何操作?

  1. 在序列化时有选择地忽略子元素,使子元素完全不被序列化
  2. 用完成与 NonSerialized 相同的东西标记一个元素

我想到了一些解决方案,例如使用反射动态生成一个类,该类包含与要序列化的类相同的所有成员,进行某种类型的深度复制,然后将其序列化。但是,我很好奇是否有任何更简单的方法来完成此序列化任务,而不是使用生成反射路由的类。

最佳答案

如果现有类型的序列化变得复杂,最好的选择是始终:创建一个单独的 DTO 模型 - 看起来有点类似您的域实体,但仅存在是为了很好地处理序列化——通常非常简单(无参数构造函数、基本访问器、无验证等)。然后在它们之间映射。否则,您将玩一场打地鼠游戏,为它并不真正喜欢的类型配置序列化程序。

如果您想要一个使用 XmlSerializer 的打地鼠游戏:您可以创建一个 XmlAttributeOverrides 实例,为您的特定类型手动配置它(添加属性实例),然后将它传递到XmlSerializer 构造函数。但这很丑陋,非常繁琐,并且您必须必须缓存并重新使用序列化程序实例(如果您使用构造函数的重载,则正常的自动组装缓存/重新使用不适用).您可以(从 XmlAttributeOverrides 实例)获取每个类型或每个成员的 XmlAttributes 实例,然后根据需要将 XmlIgnore 属性设置为 true。坦率地说,我反对这种方法。

关于c# - 如何序列化包含接口(interface)的不可修改类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346263/

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