2012-02-07 6 views
0

私はクライアントとサーバーの間でコマンドとデータを送信したいと思います。正しいタイプがわからない場合、どのようにオブジェクトを逆シリアル化できますか?

は、私は3つのプロジェクトがあります。

  • クライアント
  • 共通サーバーを - ここで私は、クライアント間の通信のために、私はデータ構造を、以下の使用しています一般的なクラスとネットワーク抽象化層

を置きますおよびサーバ

public class Packet<T> 
{ 
     public string Name { get; set; } 
     public string From { get; set; } 
     public string To { get; set; } 
     public PacketType PacketType { get; set; } 
     public T Container { get; set; } 

     public Packet() 
     { 
     } 

     public Packet(string name, PacketType packetType, T container) 
     { 
      Name = name; 
      PacketType = packetType; 
      Container = container; 
     } 
    } 

    public enum PacketType 
    { 
     Command, 
     Data 
    } 

ファイルに関する情報を送信する必要がある場合は、必要な構造体CreatePacket<FilesInfo>(filesInfo)でパケットを作成してからシリアル化し、client \ serverに送信します。

しかし、受信側でどのようにデータを逆シリアル化できますか?私はパケットがどのオブジェクトタイプであるのか分からない。私の問題を解決するための他の方法や図書館などがありますか?また、WCFを使用したくないのは、.NET 2.0がインストールされたマシン上で私のアプリケーションが動作するためです。

答えて

3

chrfinとhaiyyuの両方が同じである良い考え。以下は、あなたのタイプのデータを構築するためにPacket Baseクラスを使用することの些細なことです。あなたはパケット< T>をシリアル化し、パケットにデシリアライズします。使用はかなりシンプルです。すでに言及したように、このトリックは、タイプを簡単にアクセス可能にすることです。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var pack = new Packet<int>() { Payload = 13 }; 
     var serializedData = pack.Serialize(); 
     var deserializedData = Packet.Deserialize(serializedData); 
     Console.WriteLine("The payload type is:" + deserializedData.PayloadType.Name); 
     Console.WriteLine("the payload is: " + deserializedData.Payload); 
     Console.ReadLine(); 
    } 
} 



[Serializable] 
public class Packet 
{ 
    public Type PayloadType { get; protected set; } 
    public object Payload { get; protected set; } 
    public static Packet Deserialize(byte[] bytes) 
    { 
     return (Packet)(new BinaryFormatter()).Deserialize(new MemoryStream(bytes)); 
    } 
} 

[Serializable] 
class Packet<T> : Packet 
{ 
    public Packet() 
    { 
     PayloadType = typeof(T); 
    } 
    public new T Payload 
    { 
     get { return (T)base.Payload; } 
     set { base.Payload = value; } 
    } 

    public override string ToString() 
    { 
     return "[Packet]" + Payload.ToString(); 
    } 

    public byte[] Serialize() 
    { 
     MemoryStream m = new MemoryStream(); 
     (new BinaryFormatter()).Serialize(m, this); 
     return m.ToArray(); 
    } 
} 
2

サーバーとクライアントアプリケーションの両方で同じタイプを使用する必要があります。送信者は受信者に文字列としてデータの種類を伝えることができます。受信者はType.GetType()を使用して型を取得できます。

+0

良い提案。 – Neir0

1

あなたはまた、タイプ含むコンテナにpaketをカプセル化することができます:

public class Container 
{ 
    public Type PacketType { get; set; } 
    public byte[] Packet { get; set; } 
} 

、その後

Container c = (Container)cSerializer.Deserialize(/*Your Received Packet*/); 
Packet<c.PacketType> paket = 
    (Packet<c.PacketType>)pSerializer.Deserialize(new MemoryStream(c.Packet)); 

か、Tは常に基本クラスをextensことを要求してからということを使用することができますが受信側:

Packet<BaseClass> paket = 
    (Packet<BaseClass>)pSerializer.Deserialize(new MemoryStream(/*Data*/)); 
0

あなたはXMLシリアル化をuseingしている場合、これはうまく動作しているようです....

private string GetClassNameFromXMLSerializedString(string xml) 
    { 
     xml = xml.Substring(xml.IndexOf(">\r\n<") + 3, 50);//get second XML element 
     return xml.Substring(1, xml.IndexOf(' ') - 1);//get class name 
    }