cos*_*ost 6 c# sockets arrays byte
所以我有一个服务器和一个客户端,可以回传各种数据.最初我有一个复杂的方法,它通过字节数组并将其所有变量和字符串逐个转换为它们应该是什么.我了解到我可以将所有变量放入一个对象中并使用它将其转换为字节数组
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();
}
Run Code Online (Sandbox Code Playgroud)
并使用转换回来
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;
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦我通过网络将此字节数组发送到另一个应用程序,我不能只使用此方法将其转换回来,我得到错误"无法找到程序集'test1s,Version = 1.0.0.0,Culture =中性,PublicKeyToken = null'." test1s只是我用它做的小服务器程序的名称.显然,应用程序需要一些额外的信息来将这个数组转换回一个对象,所以我有什么方法可以做到这一点,或者我是否错了?
我想在这里完成的是除了几个变量和字符串之外的任何对象,将其转换为字节数组,将其发送到另一个应用程序,并将其转换回对象.这样我就不必使用字节数组来提取所有变量和字符串.
谢谢
有许多预先推出的序列化库可以在这里提供帮助.BinaryFormatter在这里有一些(IMO)不受欢迎的特性 - 特别是它只能在两端使用完全相同(好,几乎)的dll.
XmlSerializer,DataContractSerializer和JavaScriptSerializer是很好的基于文本的实现,并且可以在两端兼容的合同(相同的属性等 - 不一定是相同的类型/版本)下正常工作.
如果您有中等带宽需求,或者需要更好的CPU性能,我建议使用protobuf-net(警告:我写了),这是一个可能有用的快速二进制序列化器.