如何序列化包含接口的不可修改类
本文关键字:修改 接口 序列化 包含 | 更新日期: 2023-09-27 17:53:17
我试图序列化一个包含接口的对象。但是,接口不能被序列化。通常,我会使用类似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.
是否有一种方法可以在我不能修改的类中执行以下任何操作,例如系统类?
- 在序列化期间选择性地忽略子元素,以便子元素根本不被序列化
- 将元素标记为完成与
NonSerialized
相同的事情
我想到了一些解决方案,比如使用反射来动态生成一个包含与要序列化的类相同的所有成员的类,做某种类型的深度复制,并将其序列化。但是,我很想知道除了使用类生成反射路由之外,是否还有更简单的方法来完成这个序列化任务。
如果现有类型的序列化变得复杂,最好的选择是总是:创建一个单独的DTO模型-看起来与您的域实体有点相似,但它的存在只是为了很好地进行序列化-通常非常简单(无参数构造函数,基本访问器,没有验证等)。然后在它们之间绘制地图。否则,您将玩一场打地鼠游戏,为它并不喜欢的类型配置序列化器。
如果您想要与XmlSerializer玩一场打地鼹鼠游戏:您可以创建一个XmlAttributeOverrides实例,为您的特定类型手工配置它(添加属性实例),并将其传递给XmlSerializer构造函数。但是这是丑陋的,相当繁琐的,并且您必须必须缓存和重用序列化器实例(如果您使用构造函数的重载,则正常的自动程序集缓存/重用将不适用)。您可以(从XmlAttributeOverrides实例)为每个类型或每个成员获得一个XmlAttributes实例,然后根据需要将XmlIgnore属性设置为true。坦率地说,我不建议使用这种方法。
通常你序列化一个你自己实现的对象,这样你就可以完全控制像这样的实例。我将创建一个实现isserializable的包装器对象,并在其构造函数中接受Process对象。这样,您就可以自己控制序列化哪些字段。
话虽如此,序列化一个可执行进程似乎是不可行的。我想您可能希望序列化一个包含行数据的对象,然后通过连接的另一端(在反序列化时)使用这些行数据。Process类表示系统中正在运行的代码实例,因此想要序列化它似乎很奇怪。