交替使用BinaryFormatter和XmlSerializer

本文关键字:XmlSerializer BinaryFormatter | 更新日期: 2023-09-27 17:49:16

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

交替使用BinaryFormatter和XmlSerializer

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

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

检查过SoapFormatter了吗?不像XmlSerializer那么可读,但仍然是XML,您可以理解大多数值。它继承自IFormatter,和BinaryFormatter一样。所以你可以在不修改代码的情况下改变。
而且,XmlSerializer只能处理具有无参数构造函数的对象的公共属性,而IFormatters使用反射,可以处理具有参数化构造函数的私有字段和对象。此外,属性Serializable只能与格式化器一起工作,而不能与XmlSerializer一起工作。它在本质上是不同的,你可能需要修改很多代码。