2

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

2 回答 2

3

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

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

于 2012-12-20T18:15:58.443 回答
1

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

于 2012-12-20T19:36:22.873 回答