我想在服务器和客户端之间发送指令对象。我希望能够序列化接口的实现,然后,当我反序列化它时,我想将它反序列化为通用接口类型(同时它保持它被序列化的实际类型)。
我尝试使用默认的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();
这应该打印“这是一个实现!”到控制台。
答案 0 :(得分:1)
JSON是我推荐的。当然,如果你想将它解析为一个类型,你总是需要知道一个类型,但JSON序列化器是我认为你需要的最好的。
我建议在System.Runtime.Serialization.Json中使用DataContractJsonSerializer,因为它是我体验中最灵活的。
以下是有关向类型发出和反序列化的一些其他有用的问题/文章: when does DataContractJsonSerializer include the type information?
答案 1 :(得分:1)
你想要在移动的沙滩上行走,这种沙子很难用严格的类型语言来管理。
如果您有对象,请尝试使用as
关键字的方法:
var example = Desrialize(inStream) as IExample;
if (example != null)
example.foo();
我将使用的方法是创建一个特定的基础对象并在该基础上实现IExample,然后在反序列化扩展它的任何对象时,您仍然可以将它们作为基础对象或IExample
进行转换。或者,考虑是否应该在Deserialize()
方法中进行多态,通过重载或使用泛型。