C# 实现对多种格式的自定义序列化:ISerializable还是自定义解决方案?
在我目前正在开发的应用程序中,我遇到了将一些业务对象序列化为多种不同专有格式的需要 我正在努力决定最好的方法来解决这个问题,我想听听一些意见 我知道.NET为我们提供了C# 实现对多种格式的自定义序列化:ISerializable还是自定义解决方案?,c#,.net,serialization,C#,.net,Serialization,在我目前正在开发的应用程序中,我遇到了将一些业务对象序列化为多种不同专有格式的需要 我正在努力决定最好的方法来解决这个问题,我想听听一些意见 我知道.NET为我们提供了ISerializable接口,我可以在我的业务对象上实现该接口,但是当我需要序列化为3种不同的格式时,我很难理解这将如何处理 除此之外,我并不太热衷于让所有特定于序列化的代码“弄脏”我漂亮干净的业务对象——我更愿意将这一职责分配给一个专用对象。当存在许多不同的格式时,这似乎也是有意义的,因为序列化选项可以在将来通过简单地扩展基类
ISerializable
接口,我可以在我的业务对象上实现该接口,但是当我需要序列化为3种不同的格式时,我很难理解这将如何处理
除此之外,我并不太热衷于让所有特定于序列化的代码“弄脏”我漂亮干净的业务对象——我更愿意将这一职责分配给一个专用对象。当存在许多不同的格式时,这似乎也是有意义的,因为序列化选项可以在将来通过简单地扩展基类来扩展,或者在不编辑业务对象本身的情况下进行修改。再说一次,我不想“重新发明轮子”
我想知道在这种情况下你的集体经验和观点是什么
ISerializable
是否是多种格式的可行选项?
或者自定义类或服务是否更适合此任务?
是否有任何设计模式或进一步的框架功能涵盖这一领域?您可以使用
ISerializable
为每个对象获取一种通用中间数据存储形式(SerializationInfo
),然后,您可以为该中间类型实现三个单独的处理程序,以将它们转换为最终形式。就我个人而言,我当然不希望在一个业务对象中看到三种形式的序列化代码
根据对象的数量和复杂性,创建自己的接口可能更简单,每个类都必须支持序列化。这样,您就可以实现完全的灵活性,但代价是无法使用标准序列化位。自定义序列化.NET方式、完全自定义序列化、仅标记类、仅标记类和添加一些调整都是可用的: 在以下情况下,自定义序列化非常有用:
IEnumerable
上是这样,我不知道所有这样的接口是否都会发生这种情况,我很确定二进制序列化不会发生这种情况-实际上这是一个bug,应该修复,但目前它还在那里)[Serializable]
属性放在类和它所属的任何类上,这将为您提供默认的序列化行为
进一步的调整可能来自将
[非序列化]
放在不应序列化的成员上(假设您拥有BigObject\u big;int\u bigID
并通过在第一次访问时基于\u bigID
延迟加载它来记忆对\u big
的访问。在这种情况下,您可以通过将\u big
标记为非序列化来序列化\IDeserializationCallback
通过通知类en它是通过反序列化创建的。听起来你需要一个自定义序列化程序来实现你想要序列化对象的每一种格式。正如我在评论中提到的,你可以使用同一个对象,然后用Json序列化程序进行序列化,它会给你一个该对象的Json表示,然后用XML序列化程序进行序列化获取XML等
因此,对于您的每种格式,您只需要一个自定义序列化程序,它可以在该格式之间进行序列化/反序列化。您能详细说明一下这些格式可能是什么吗?Xml、csv等?@theburningmonk.ISerializable可以有效地处理包含“我们还没有发明的东西”的格式。当然,它们是专有格式。一种是基于文本的表示,使用特殊代码和标识符来标识数据类型和变量,另两种是二进制格式。没有XML或CSV-我希望它能这么简单!)我明白了,这只是一个猜测,但听起来您可能需要自定义序列化程序,并且您不必修改业务对象,例如,由json序列化程序序列化的同一对象为我提供了该对象的json表示,由XML序列化程序序列化的对象为我提供了json表示