2016-01-06 220 views

回答

2

.NET上有許多序列化程序可用。

最簡單的是二進制序列化。這是最相似相當於在C#

https://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx

但問題是,如果你使用這個,你的服務器和客戶端都需要在鎖升級步驟(即,如果你升級你的服務器,你必須更新所有客戶端,否則服務器將無法反序列化舊客戶端的請求)

DataContractSerializer提供了XML格式的消息,並具有專爲Web服務設計的選項,以便它可以執行某些版本容差。

https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datacontractserializer(v=vs.110).aspx

特別是,它允許錯過屬性(例如,當服務器升級,讓更多的旋鈕,但老客戶都不能發送)。

對於你的另一個問題。 要從Socket獲取流,只需使用套接字作爲參數創建一個System.Net.Socket.NetworkStream對象實例。

Stream s = new NetworkStream(socket); 

Windows Communication Foundation(WCF)抽象了很多編程分佈式系統的細節。使用WCF編寫服務器客戶端應用程序而不是使用原始套接字進行編程要容易得多。

+0

謝謝! 什麼是它的等效「in = new ObjectInputStream(new BufferedInputStream(sock.getInputStream()));」爲了在套接字中寫入? – TotorAndMimine

+0

它在C#中不能以這種方式工作 您創建一個NetworkStream對象實例,然後使用Serializer對象寫入該流。 它更像 在新= ObjectInputStream中(新的BufferedInputStream(sock.getInputStream()); in.writeObject(objectToWrite); 將轉化到 NetworkStream ns = new NetworkStream(sock); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(objectToWrite,ns); –

2

它沒有直接的等價物,但它的功能很容易用Stream和XmlSerializer/BinaryFormatter實現。

下面是使用XmlSerializer的一個例子:

public void StoreToFile<T>(T ObjectToStore, string FileName) 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(T)); 
    using(Stream str = File.Create(FileName)) 
     ser.Serialize(str, ObjectToStore); 
} 

public T RetrieveFromFile(string FileName) 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(T)); 
    using(Stream str = File.Open(FileName)) 
     return (T)ser.Deserialize(str); 
} 

然後,當你想存儲一個類文件中的使用:

MyClass instance = new MyClass(); //The class we want to store. 
StoreToFile(instance, "instance.dat"); 

,並檢索它:

MyClass instance = RetrieveFromFile<MyClass>("instance.dat"); 

這是一個在文件中只存儲一個類的基本示例,但您可以擴展它以存儲連接在這些流上的更多項目。

而且,和的getOutputStream的getInputStream沒有直接對應的,你可以隨時使用的NetworkStream:

NetworkStream myStream = new NetworkStream(theSocket); 

它會表現爲輸入和輸出流,在.NET流通常是讀/寫,所以不需要有兩個sepparated流。