繁体   English   中英

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

[英]Serialize C# object, want to deserialize to an interface

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM