C# 如何实现我的序列化方法,使其具有多态性和可扩展性

C# 如何实现我的序列化方法,使其具有多态性和可扩展性,c#,serialization,.net-4.0,C#,Serialization,.net 4.0,当前所有我的对象都包含保存和加载方法。这些方法基本上是创建一个xml文档。内部对象使用各自的保存方法(有时是其接口)进行序列化。现在,我有时希望在一些对象中执行不同的序列化。 所以基本上我希望能够从一个序列化版本转换到另一个 一种方法是将序列化逻辑从类本身分离到一个单独的类中(有点像microsoft的xmlserializer),从而扩展功能,但是当对象的类型对我来说是未知的,因为它是基类或接口时,我会遇到一个问题 除了使用XmlSerializer或DataContractSerialize

当前所有我的对象都包含保存和加载方法。这些方法基本上是创建一个xml文档。内部对象使用各自的保存方法(有时是其接口)进行序列化。现在,我有时希望在一些对象中执行不同的序列化。 所以基本上我希望能够从一个序列化版本转换到另一个

一种方法是将序列化逻辑从类本身分离到一个单独的类中(有点像microsoft的xmlserializer),从而扩展功能,但是当对象的类型对我来说是未知的,因为它是基类或接口时,我会遇到一个问题

除了使用XmlSerializer或DataContractSerializer之外,还有其他更好的方法吗

谢谢, Pavel

如果我理解正确(注释),您有每个实现提供的现有Save(…)方法,并且不希望为不同的布局添加Save2(…)

在这种情况下,我只需添加任何定义新格式的参数。如果它可能涉及多个内容(可能是版本号和格式),我将编写一个类,例如
SerializationContext
,将这些内容作为属性,并修改现有的保存以获取这些内容,即

Save(..., SerializationContext ctx)
任何现有代码都可能会完全忽略
ctx
,但必要时,您的类可以选择检查
ctx.Version
ctx.Format
等,以适当地执行操作。如果需要,您还可以在以后向
SerializationContext
添加其他内容。

如果我理解正确(注释),您拥有每个实现提供的现有Save(…)方法,并且不希望为不同的布局添加Save2(…)

在这种情况下,我只需添加任何定义新格式的参数。如果它可能涉及多个内容(可能是版本号和格式),我将编写一个类,例如
SerializationContext
,将这些内容作为属性,并修改现有的保存以获取这些内容,即

Save(..., SerializationContext ctx)

任何现有代码都可能会完全忽略
ctx
,但必要时,您的类可以选择检查
ctx.Version
ctx.Format
等,以适当地执行操作。如果需要,您还可以在以后向
SerializationContext
添加其他内容。

什么,特别是当基类型未知时的问题?当类型未知且在外部类中执行序列化时-此类可能不知道要序列化的所有成员。嗯,
XmlSerializer
不知道“知道”所有要序列化的成员-但是,它可以使用反射和指令的组合(通常通过属性,但也可以通过代码)来推断它们。为了给出一个合理的答案,我试图理解您当前遇到的问题-例如,如果您只使用
新的XmlSerializer,有什么不起作用(obj.GetType())
?我没有使用XmlSerializer。当前每个对象都知道自己的结构,并且能够自己序列化。现在我想添加另一个序列化,但不想添加名为“save2”的方法“当基类型未知时,具体的问题是什么?当类型未知且在外部类中执行序列化时-此类可能不知道要序列化的所有成员。嗯,
XmlSerializer
不“知道”要序列化的所有成员-但是,它可以使用反射和指令的组合来推断它们(通常通过属性,但也可以通过代码)为了给出一个合理的答案,我试图了解您当前遇到的问题-例如,如果您只使用
新的XmlSerializer(obj.GetType()),这里有什么不起作用
?我没有使用XmlSerializer。目前每个对象都知道自己的结构,并且能够自己序列化。现在我想添加另一个序列化,但不想添加名为“save2”的方法谢谢。是的,你理解正确。我希望避免检查版本,因为它有点像在同一块中添加save2。我将再次检查策略或访问者设计模式是否对我有用。谢谢。是的,你理解正确。我希望避免检查版本,因为它有点像在同一块中添加save2。我将再次检查策略或访问者设计模式是否对我有用。