如何知道反序列化 class 的类型??(或对象)
How to know the type of deserialized class??(or objects)
我有两个classes
[Serializable]
public class Class1
{
public List<String[]> items= new List<string[]>();
}
[Serializable]
public class Class2
{
public List<String[]> items = new List<string[]>();
}
然后我序列化这些 classes 并像这样向客户端发送数据
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..
如何知道反序列化的类型 class??(或对象)
您应该可以将其反序列化为对象,然后使用 GetType()
GetType(new BinaryFormatter().Deserialize(stream));
最好确保stream
中序列化对象的类型。
也就是说,您应该定义一些顺序或协议来保证,例如,流中的第一个对象是 Class1
的实例,然后是 Class2
.
的实例
这样做,您可以或多或少地控制它:从流中反序列化 Class1
的实例,您可以根据 [=12= 中的数据决定流中的下一个对象应该是什么对象] 对象。
另一个解决方案是将 Class1
和 Class2
的对象包装到某个容器 class 中,然后只序列化该容器的对象。
如果你需要每次都序列化相同类型的对象,它就可以了。
但是,如果您只需要检查类型,那么从流中反序列化任何对象后,您可以通过 is
-check、比较其类型标记或安全转换来检查其类型。看例子:
object d = binaryFormatter.Deserialize(stream);
Class1 c1 = null;
if ((c1 = d as Class1) != null) {
//do something with c1
}
我提议将一个字节添加到从对象反序列化的字节数组的头部,在服务器中,您只需检查第一个字节即可知道该缓冲区的内容 Class。这将使服务器性能。
switch(buffer[0])
{
case DataType.NORMAL:
...
break;
case DataType.FILE_TRANSFER:
...
break;
....
}
我有两个classes
[Serializable]
public class Class1
{
public List<String[]> items= new List<string[]>();
}
[Serializable]
public class Class2
{
public List<String[]> items = new List<string[]>();
}
然后我序列化这些 classes 并像这样向客户端发送数据
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..
如何知道反序列化的类型 class??(或对象)
您应该可以将其反序列化为对象,然后使用 GetType()
GetType(new BinaryFormatter().Deserialize(stream));
最好确保stream
中序列化对象的类型。
也就是说,您应该定义一些顺序或协议来保证,例如,流中的第一个对象是 Class1
的实例,然后是 Class2
.
这样做,您可以或多或少地控制它:从流中反序列化 Class1
的实例,您可以根据 [=12= 中的数据决定流中的下一个对象应该是什么对象] 对象。
另一个解决方案是将 Class1
和 Class2
的对象包装到某个容器 class 中,然后只序列化该容器的对象。
如果你需要每次都序列化相同类型的对象,它就可以了。
但是,如果您只需要检查类型,那么从流中反序列化任何对象后,您可以通过 is
-check、比较其类型标记或安全转换来检查其类型。看例子:
object d = binaryFormatter.Deserialize(stream);
Class1 c1 = null;
if ((c1 = d as Class1) != null) {
//do something with c1
}
我提议将一个字节添加到从对象反序列化的字节数组的头部,在服务器中,您只需检查第一个字节即可知道该缓冲区的内容 Class。这将使服务器性能。
switch(buffer[0])
{
case DataType.NORMAL:
...
break;
case DataType.FILE_TRANSFER:
...
break;
....
}