Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现对多种格式的自定义序列化:ISerializable还是自定义解决方案?_C#_.net_Serialization - Fatal编程技术网

C# 实现对多种格式的自定义序列化:ISerializable还是自定义解决方案?

C# 实现对多种格式的自定义序列化:ISerializable还是自定义解决方案?,c#,.net,serialization,C#,.net,Serialization,在我目前正在开发的应用程序中,我遇到了将一些业务对象序列化为多种不同专有格式的需要 我正在努力决定最好的方法来解决这个问题,我想听听一些意见 我知道.NET为我们提供了ISerializable接口,我可以在我的业务对象上实现该接口,但是当我需要序列化为3种不同的格式时,我很难理解这将如何处理 除此之外,我并不太热衷于让所有特定于序列化的代码“弄脏”我漂亮干净的业务对象——我更愿意将这一职责分配给一个专用对象。当存在许多不同的格式时,这似乎也是有意义的,因为序列化选项可以在将来通过简单地扩展基类

在我目前正在开发的应用程序中,我遇到了将一些业务对象序列化为多种不同专有格式的需要

我正在努力决定最好的方法来解决这个问题,我想听听一些意见

我知道.NET为我们提供了
ISerializable
接口,我可以在我的业务对象上实现该接口,但是当我需要序列化为3种不同的格式时,我很难理解这将如何处理

除此之外,我并不太热衷于让所有特定于序列化的代码“弄脏”我漂亮干净的业务对象——我更愿意将这一职责分配给一个专用对象。当存在许多不同的格式时,这似乎也是有意义的,因为序列化选项可以在将来通过简单地扩展基类来扩展,或者在不编辑业务对象本身的情况下进行修改。再说一次,我不想“重新发明轮子”

我想知道在这种情况下你的集体经验和观点是什么

ISerializable
是否是多种格式的可行选项? 或者自定义类或服务是否更适合此任务?
是否有任何设计模式或进一步的框架功能涵盖这一领域?

您可以使用
ISerializable
为每个对象获取一种通用中间数据存储形式(
SerializationInfo
),然后,您可以为该中间类型实现三个单独的处理程序,以将它们转换为最终形式。就我个人而言,我当然不希望在一个业务对象中看到三种形式的序列化代码


根据对象的数量和复杂性,创建自己的接口可能更简单,每个类都必须支持序列化。这样,您就可以实现完全的灵活性,但代价是无法使用标准序列化位。

自定义序列化.NET方式、完全自定义序列化、仅标记类、仅标记类和添加一些调整都是可用的:

在以下情况下,自定义序列化非常有用:

  • 对象是完全或部分不可变的(一个或多个成员是只读的),因此无论如何都必须通过构造函数反序列化(当然,工厂方法也可以通过调用现有构造函数来工作)
  • 图是复杂的,但大部分可以通过系统知识简化(例如,“我知道我不需要完全序列化该成员,我只需要序列化足够的信息,就可以在反序列化时创建新实例”
  • 通用类是以特定的方式使用的(当然,它们总是…),了解这些细节可以降低图形的复杂性
  • 您正在对一个类执行XMLSeriazation操作,该类继承或实现了一个模板类或自身参数化的抽象类(在映射图形时,这会进入一个无限循环,至少在
    IEnumerable
    上是这样,我不知道所有这样的接口是否都会发生这种情况,我很确定二进制序列化不会发生这种情况-实际上这是一个bug,应该修复,但目前它还在那里)
  • 您需要保证向后和/或向前与类的更高版本的兼容性(由您来确保这是可行的,但如果您不在其中,您就没有希望了)
  • 您有一个无法编辑的类的成员(提供了框架或第三部分),该类是不可序列化的,因此您需要提供自己的序列化方法
  • ISerialiseble将提供一个抽象(命名的东西进入,命名的东西出来),它依次用于不同的格式

    如果您需要一种非常特定的格式(例如,以特定模式序列化),那么您可能需要查看其他接口(例如,IXmlSerializable),以便在使用序列化方法时更加明确,或者忽略.NET提供的序列化技术,并使用自己的方法生成和解析不同的格式

    在另一个极端,您可以将
    [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表示