0

我尝试使用BinaryFormatter带有一个公共字段(字符串)的类,但是,另一个应用程序中的相同类无法反序列化它。

如果可能,我希望该类包含其自身类型(递归)的字段,但如果不是 - strings、ints 和byte数组是最重要的。

4

2 回答 2

1

如果您不能在应用程序之间共享一个类库,您可以在客户端(消费者)应用程序中创建一个镜像类,并将其所有属性映射到“初始”类的属性+一些辅助信息。这将是您的代理类。然后,您应该控制反序列化过程。例如,使用 xml 来保存数据。如果安全性至关重要,您可以加密文件的内容并在应用程序之间共享公钥。

于 2012-09-05T15:56:29.877 回答
1

BinaryFormatter 将在输出中包含完整的类型名称(包括程序集和命名空间)。您需要使用自定义 SerializationBinder 来读取它:

public class CustomBinder : SerializationBinder
{
    static string assemblyToUse = typeof (MyObject).Assembly.FullName;
    public override Type BindToType(string assemblyName, string typeName)
    {
        if (typeName.EndsWith("MyType"))
            return typeof(MyTypeInThisAssembly);
        return base.BindToType(assemblyName, typeName);
    }
}


var formatter = new BinaryFormatter{Binder = new CustomBinder()};
var obj = formatter.Deserialize(...)

这样做的缺点是必须在每个程序集中包含 CustomFormatter 的代码,我猜这不是你想要的。这可能会让您不得不使用自定义格式输出(如JSON协议缓冲区

于 2012-09-05T15:56:45.117 回答