因此,我有一个服务器和一个客户端,它们来回传递各种数据。最初,我有一个复杂的方法,它遍历字节数组,并将它的所有变量和字符串一个接一个地转换成它们应该是的样子。我学习了如何将所有变量放入一个对象中,并将其转换为一个字节数组
private static byte[] ObjectToByteArray2(Object obj)
{
if (obj == null)
return null;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, obj);
return ms.ToArray();
}并使用以下命令将其转换回来
private static Object ByteArrayToObject(byte[] arrBytes)
{
MemoryStream memStream = new MemoryStream();
BinaryFormatter binForm = new BinaryFormatter();
memStream.Write(arrBytes, 0, arrBytes.Length);
memStream.Seek(0, SeekOrigin.Begin);
Object obj = (Object)binForm.Deserialize(memStream);
return obj;
}问题是,一旦我通过网络将这个字节数组发送到另一个应用程序,我就不能只使用这个方法将它转换回来,我得到了错误消息"Unable to find assembly 'test1s,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null‘“。test1s只是我开发的一个小服务器程序的名字。显然,应用程序需要一些额外的信息来将这个数组转换回一个对象,所以我有什么方法可以做到这一点,或者我的问题是错的吗?
我想在这里完成的是一个只有几个变量和字符串的对象,将其转换为字节数组,将其发送到另一个应用程序,并将其转换回对象。这样,我就不必使用字节数组来提取所有的变量和字符串。
谢谢
发布于 2010-11-14 13:06:27
有无数的预滚动序列化库将在这里提供帮助。BinaryFormatter在这里有一些(IMO)不受欢迎的特性--特别是它只能在两端使用完全相同(好吧,差不多)的dll。
XmlSerializer、DataContractSerializer和JavaScriptSerializer都是很好的基于文本的实现,并且可以在两端使用兼容的契约(相同的属性等-不一定是相同的类型/版本)。
如果你有中等的带宽需求,或者需要更好的CPU性能,我会推荐protobuf-net (注意:我写的),这是一个快速的二进制序列化程序,可能会有所帮助。
发布于 2010-11-14 12:55:49
如果通信通道的两端都有对完全相同的程序集的引用和完全相同版本的该程序集的引用,或者以某种方式从程序引用,或者驻留在GAC中,那么这将起作用。
如果您想要一种更能容忍版本不匹配的机制,请考虑改用XMLSerializer (但请注意,如果版本不匹配,字段/属性中的添加/删除/更改可能会导致不正确的行为)。
如果需要紧凑的格式,您可以考虑使用Google Protocol Buffers。
发布于 2010-11-14 12:57:35
如果发送字符串列表(或字符串字典)是您想要的,那么只需发送字符串列表(或字典)即可。您的问题出现是因为您试图发送另一个项目无法识别的数据类型。你甚至不需要改变你的任何功能,你只需要改变你发送的内容。或者,您可以从接收数据的程序引用test1s。
https://stackoverflow.com/questions/4176235
复制相似问题