3

我想在服务器和客户端之间发送指令对象。我希望能够序列化接口的实现,然后,当我反序列化它时,我想将它反序列化为通用接口类型(同时它保持它被序列化为的实际类型)。

我尝试使用默认的 BinarySerializer 执行此操作,但在通过网络发送信息时遇到了问题。

我也尝试使用 Protobuf 进行序列化,但使用 Protobuf 您必须知道要反序列化的对象的完全限定类型。IE:

public interface IExample
{
     void foo();
}
public class Implementation : IExample
{
     void foo() { Console.WriteLine("This is an implementation!"); }
}

只能通过以下方式反序列化:

Serializer.Deserialize<Implementation>(stream); 

这违背了多态性的观点。

是否有我可以使用的序列化库,其中反序列化方法的调用者不需要知道对象的完全限定类型?

IE:

Implementation imp = new Implementation();
Stream inStream = Serialize(implementation);
IExample example = Deserialize(inStream);

example.foo();

这应该打印“这是一个实现!” 到控制台。

4

2 回答 2

1

JSON是我推荐的。当然,如果你想把它解析为一个类型,你总是需要知道一个类型,但是 JSON 序列化器是我认为你需要的最好的。

我建议在 System.Runtime.Serialization.Json 中使用 DataContractJsonSerializer,因为它是我经验中最灵活的。

以下是一些关于向类型发出和反序列化的其他有用问题/文章: DataContractJsonSerializer 何时包含类型信息?

http://kashfarooq.wordpress.com/2011/01/31/creating-net-objects-from-json-using-datacontractjsonserializer/

于 2013-07-28T02:48:40.147 回答
1

你想在流沙上行走,这在严格类型的语言中很难管理。

如果您有对象,请尝试使用as关键字的方法:

var example = Desrialize(inStream) as IExample;
if (example != null)
    example.foo();

我将使用的方法是创建一个特定的基础对象并在该基础上实现 IExample,然后在反序列化任何扩展它的对象时,您仍然可以将它们转换为基础对象或作为IExample. 或者,考虑是否应该Deserialize()通过重载或使用泛型在方法中发生多态性。

于 2013-07-28T02:51:23.313 回答