所以我有一个服务器和一个客户端,可以回传各种数据,第四个。最初我有一个复杂的方法,它通过字节数组并将其所有变量和字符串逐个转换为它们应该是什么。我了解到我可以将所有变量放入一个对象并使用
将其转换为字节数组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;
}
问题是,一旦我将这个字节数组通过网络发送到另一个应用程序,我不能只使用这种方法将其转换回来,我得到错误“无法找到程序集'test1s,版本= 1.0.0.0 ,Culture = neutral,PublicKeyToken = null'。“ test1s只是我用它做的小服务器程序的名称。显然,应用程序需要一些额外的信息来将这个数组转换回一个对象,所以我有什么方法可以做到这一点,或者我是否错了?
我想在这里完成的是除了几个变量和字符串之外的任何对象,将其转换为字节数组,将其发送到另一个应用程序,然后将其转换回对象。这样我就不必使用字节数组来提取所有变量和字符串。
由于
答案 0 :(得分:8)
有许多预先推出的序列化库可以在这里提供帮助。 BinaryFormatter在这里有一些(IMO)不受欢迎的功能 - 特别是它只能在两端使用完全相同的(好的,几乎相同的)dll。
XmlSerializer,DataContractSerializer和JavaScriptSerializer是很好的基于文本的实现,并且可以在两端使用兼容的契约(相同的属性等 - 不一定是相同的类型/版本)。
如果你有适度的带宽需求,或者需要更好的CPU性能,我会推荐protobuf-net(警告:我写了),这是一个可能有帮助的快速二进制序列化器。
答案 1 :(得分:4)
如果通信渠道的双方都引用完全相同的程序集和该程序集的完全相同版本,这将起作用,或者以某种方式从程序中引用或居住在GAC。
如果您希望机制更能容忍版本不匹配,请考虑使用XMLSerializer
代替(但请注意,如果版本不匹配,则字段/属性中的添加/删除/更改可能会导致错误的行为)。< / p>
如果需要紧凑格式,您可以考虑查看Google Protocol Buffers。
答案 2 :(得分:1)
如果发送字符串列表(或字符串的字典)是您想要的那就没问题,只需发送一个字符串列表(或字典)。您的问题是因为您尝试发送另一个项目无法识别的数据类型。您甚至不需要更改任何功能,只需更改发送的内容即可。或者,您可以从接收数据的程序中引用test1s。
答案 3 :(得分:0)
从/到字节转换器编写自己的对象,而不是使用BinaryStream应该工作。
如果您坚持,请将此对象移动到其自己的程序集,并将其添加到两侧作为参考。通过这种方式,.NET Framework应该能够对对象进行de / serialize。