可以互换使用BinaryFormatter和XmlSerializer

时间:2012-12-20 17:33:42

标签: c# xml-serialization binaryformatter

我继承了大量使用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);
}

2 个答案:

答案 0 :(得分:3)

正如已经指出的那样,并非所有二进制可序列化的对象都是XML可序列化的(例如,任何带有TimeSpan的对象)。

但是如果你能处理这个非常严重的缺陷,那么我可能采取的方法是创建自己的界面。然后我会有两个实现它的类,一个包装二进制格式化程序,一个包装XML序列化程序。为了使生活更轻松,请根据应用程序使用的方法名称和参数使界面与二进制格式化程序非常相似,以便您可以相对轻松地替换具体二进制格式化程序的出现。

答案 1 :(得分:1)

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

相关问题