[英]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何時包含類型信息?
你想要在流動的沙灘上行走,這種沙子很難用嚴格的類型語言來管理。
如果您有對象,請嘗試使用as
關鍵字的方法:
var example = Desrialize(inStream) as IExample;
if (example != null)
example.foo();
我將使用的方法是創建一個特定的基礎對象並在該基礎上實現IExample,然后在反序列化任何擴展它的對象時,您仍然可以將它們轉換為基礎對象或IExample
。 或者,考慮是否應該在Deserialize()
方法中進行多態,通過重載或使用泛型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.