簡體   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