如何知道反序列化类的类型??(或对象)

时间:2015-07-14 08:58:01

标签: c# serialization deserialization tcpclient tcp-ip

我有两个班级

[Serializable]    
public class Class1
{                
    public List<String[]> items= new List<string[]>();        
}

[Serializable]
public class Class2
{
    public List<String[]> items = new List<string[]>();                
}

我将这些类序列化并将数据发送到这样的客户端

NetworkStream stream = client.GetStream();
MemoryStream memory = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();

Class1 data = new Class1(); // or Class2
data.items.Add(new String[]{"1", "2", "3"});       

bf.Serialize(memory, data);
memory.Position = 0;

byte[] buffer = memory.ToArray();                        

stream.Write(buffer, 0, buffer.Length);
stream.Flush();

当客户端程序从服务器接收数据时,程序会像这样处理数据

BinaryFormatter bf = new BinaryFormatter();
MemoryStream memory = new MemoryStream();
NetworkStream stream = client.GetStream();

int bufferSize = client.ReceiveBufferSize;
byte[] buffer = new byte[bufferSize];
int bytes = stream.Read(buffer, 0, buffer.Length);

memory.Write(buffer, 0, buffer.Length);
memory.Position = 0;

但在这种情况下,我不知道数据的类型是什么......是Class1 ???或Class2 ..

如何知道反序列化类的类型??(或对象)

3 个答案:

答案 0 :(得分:3)

您应该能够将其反序列化为对象,然后使用GetType()

GetType(new BinaryFormatter().Deserialize(stream));

答案 1 :(得分:0)

确保stream中序列化对象的类型要好得多。 也就是说,您应该定义一些顺序或协议,以保证例如流中的第一个对象是Class1的实例,然后转到Class2的实例。

这样做,您可以或多或少地控制:从流中反序列化Class1的实例,您可以根据Class1对象中的数据决定流中的下一个对象应该是什么

另一种解决方案是将Class1Class2的对象包装到某个容器类中,然后只序列化该容器的对象。 如果您每次都需要序列化相同类型的对象,它将会这样做。

但是如果您只需要检查类型,那么从流中反序列化任何对象后,您可以通过is检查其类型 - 检查,比较其类型标记或安全转换。参见示例:

object d = binaryFormatter.Deserialize(stream);
Class1 c1 = null;
if ((c1 = d as Class1) != null) {
    //do something with c1
}

答案 2 :(得分:0)

我提供将一个字节添加到从对象反序列化的字节数组中,并且在服务器中,您只需要检查第一个字节以了解该缓冲区的哪个类。这将使服务器性能。

switch(buffer[0])
{
    case DataType.NORMAL:
    ...
    break;
    case DataType.FILE_TRANSFER:
    ...
    break;
    ....
}