C# 交替使用BinaryFormatter和XmlSerializer

C# 交替使用BinaryFormatter和XmlSerializer,c#,xml-serialization,binaryformatter,C#,Xml Serialization,Binaryformatter,我继承了大量使用BinaryFormatter进行序列化的代码,现在需要调试这些代码。当前所有序列化代码都需要一个IFormatter 我有一个想法,用XmlSerializer替换BinaryFormatter,以便更容易地检查序列化的输出,但是它们不兼容—没有公共基或接口 是否有一种标准的方法来实现这一点,例如,使参数成为某种我的代码可以使用的通用序列化程序?理想情况下,我希望在顶层创建我想要的任何具体序列化程序,然后它将其向下传递,而下层不需要知道具体类型 我目前拥有的示例: Binary

我继承了大量使用BinaryFormatter进行序列化的代码,现在需要调试这些代码。当前所有序列化代码都需要一个IFormatter

我有一个想法,用XmlSerializer替换BinaryFormatter,以便更容易地检查序列化的输出,但是它们不兼容—没有公共基或接口

是否有一种标准的方法来实现这一点,例如,使参数成为某种我的代码可以使用的通用序列化程序?理想情况下,我希望在顶层创建我想要的任何具体序列化程序,然后它将其向下传递,而下层不需要知道具体类型

我目前拥有的示例:

BinaryFormatter bformatter = new BinaryFormatter();     //create a binary formatter
PutPw(bformatter, stream, panel.DevicePassword);    //encode and stream the password

public static void PutPw(IFormatter bf, Stream stream, string pw)
{
    ...
    bf.Serialize(stream, pw);
}

正如已经指出的,并非所有二进制可序列化的对象都是XML可序列化的,例如,任何具有时间跨度的对象


但是如果你能处理这个相当严重的缺陷,那么我可能会采取的方法是创建我自己的接口。然后我将有两个类来实现它,一个封装二进制格式化程序,另一个封装XML序列化程序。为了简化操作,在应用程序使用的方法名称和参数方面,让界面与二进制格式化程序非常相似,这样您就可以相对轻松地替换出现的具体二进制格式化程序

正如已经指出的,并非所有二进制可序列化的对象都是XML可序列化的,例如,任何具有时间跨度的对象

但是如果你能处理这个相当严重的缺陷,那么我可能会采取的方法是创建我自己的接口。然后我将有两个类来实现它,一个封装二进制格式化程序,另一个封装XML序列化程序。为了简化操作,在应用程序使用的方法名称和参数方面,让界面与二进制格式化程序非常相似,这样您就可以相对轻松地替换出现的具体二进制格式化程序

您检查过SoapFormatter吗?不像XmlSerializer那样可读,但仍然是XML,您可以理解大多数值。它继承自IFormatter,就像BinaryFormatter一样。因此,您无需触摸代码即可更改为。 此外,XmlSerializer只能处理具有无参数构造函数的对象的公共属性,而iFormatter使用反射,可以使用参数化构造函数处理私有字段和对象。此外,属性Serializable只能用于格式化程序,不能用于XmlSerializer。这在本质上是不同的,您可能需要更改很多代码。

您检查过SoapFormatter吗?不像XmlSerializer那样可读,但仍然是XML,您可以理解大多数值。它继承自IFormatter,就像BinaryFormatter一样。因此,您无需触摸代码即可更改为。
此外,XmlSerializer只能处理具有无参数构造函数的对象的公共属性,而iFormatter使用反射,可以使用参数化构造函数处理私有字段和对象。此外,属性Serializable只能用于格式化程序,不能用于XmlSerializer。XML序列化与二进制格式不兼容,不是每个二进制formattable对象树都可以序列化为XML:测试问题也是如此,即您需要伪造序列化程序,以便测试代码。或者你想插入其他序列化程序来代替二进制序列化程序?@ScruffyDuck:两者都是真的,短期内我只想替换BinaryFormatter来调试代码-从长远来看,我希望能够在运行时选择序列化程序,根据客户的要求。XML序列化与二进制格式不兼容,不是每个二进制formattable对象树都可以序列化为XML:测试问题也是如此,即您需要伪造序列化程序,以便测试代码。或者你想插入其他的序列化程序来代替二进制序列化程序?@ScruffyDuck:两者都是真的,短期内我只想替换二进制格式化程序来调试代码——从长远来看,我希望能够在运行时选择序列化程序,这取决于客户的要求。是的,听起来不错。然后,我可以将由于序列化失败而导致的任何XML错误处理放在我的具体XML包装器中。然后,我可以将由于序列化失败而导致的任何XML错误处理放在我的具体XML包装器中。是的,回答不错+1,但我已经尝试了SoapFormatter,不,它不是很可读。当我通过它序列化时,它也不总是添加正确的变量名。不过,正如您所说,它也源自IFormatter,这对于快速测试很有好处。@Surfbutler根据我的经验,名称还可以。不正确的名称可能是因为类作者实现了Iserializeble,并在自定义seriali中提供了另一个名称
化。不确定它是否有帮助。另一种在不破坏现有代码的情况下生成可读流的方法是困难的——实现自己的IFormatter。这是一个小例子。谢谢。重新iserializable,其中一个变量被序列化为'm_value',并且该名称不在代码中的任何位置。我们的变量名称不同。Re-iformatter,好吧,酷,我来看看这个例子,干杯。刚刚意识到为什么变量名在soap文件中看起来是错误的——构建过程混淆了可执行文件!是的,回答很好+1,但我已经试过SoapFormatter,不,它不是很可读。当我通过它序列化时,它也不总是添加正确的变量名。不过,正如您所说,它也源自IFormatter,这对于快速测试很有好处。@Surfbutler根据我的经验,名称还可以。不正确的名称可能是因为类作者实现了Iserializeble,并在自定义序列化中提供了另一个名称。不确定它是否有帮助。另一种在不破坏现有代码的情况下生成可读流的方法是困难的——实现自己的IFormatter。这是一个小例子。谢谢。重新iserializable,其中一个变量被序列化为'm_value',并且该名称不在代码中的任何位置。我们的变量名称不同。Re-iformatter,好吧,酷,我来看看这个例子,干杯。刚刚意识到为什么变量名在soap文件中看起来是错误的——构建过程混淆了可执行文件!