2013-07-28 104 views
3

我想在服務器和客戶端之間發送指令對象。我想能夠序列化一個接口的實現,然後,當我反序列化它時,我想將它反序列化爲通用接口類型(同時它保持它被序列化爲的實際類型)。序列化C#對象,想要反序列化到接口

我試着用默認的BinarySerializer做這件事,但是我在通過線路發送信息時遇到了問題。

我也嘗試過使用Protobuf來序列化,但是使用Protobuf你必須知道你想要反序列化到的對象的完全限定類型。 IE:

Serializer.Deserialize<Implementation>(stream); 

這違背多態性的點:

public interface IExample 
{ 
    void foo(); 
} 
public class Implementation : IExample 
{ 
    void foo() { Console.WriteLine("This is an implementation!"); } 
} 

只能與被反序列化。

是否有序列化庫我可以使用deserialize方法的調用者不需要知道對象的完全限定類型?

IE:

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

example.foo(); 

這應打印 「這是一個實現!」到控制檯。

+0

http://stackoverflow.com/q/775647 –

+0

http://stackoverflow.com/q/15480780 –

回答

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/

+0

謝謝,這些資源看起來很有前景 – jokulmorder

1

你想要走在流沙,這可能是難以管理的嚴格定義的語言。

如果你有一個對象,請嘗試使用as關鍵字的方法:反序列化時

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

我會使用,雖然是創建一個特定的基礎對象和基礎上實現的IExample的方法,然後任何擴展它的對象仍然可以將它們轉換爲基礎對象或IExample。或者,考慮多態性是否應該在Deserialize()方法中發生,無論是通過重載還是使用泛型。