序列化C#对象,想要反序列化到接口

时间:2013-07-28 02:38:50

标签: c# .net json serialization protobuf-net

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

我尝试使用默认的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); 

打败了多态性。

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

IE:

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

example.foo();

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

2 个答案:

答案 0 :(得分:1)

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

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

以下是有关向类型发出和反序列化的一些其他有用的问题/文章: when does DataContractJsonSerializer include the type information?

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

答案 1 :(得分:1)

你想要在移动的沙滩上行走,这种沙子很难用严格的类型语言来管理。

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

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

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