我试图以字节流的形式在2个进程之间发送数据,这几乎对所有类都有效,但我遇到的一个问题是,如果对象的类中有一个字节数组,则deserilization会失败它并给我一个错误,说明无法加载发生血清的装配。我不能在这里包含程序集,因为发送方和接收方都是不同的应用程序。
有没有办法解决这个问题?
编辑:很抱歉,事实证明即使是正常的课程也无法在另一端反序列化
编辑:其中一个应用程序使用.Net 2.0
public static byte[] SerializeToByteArray(this object obj)
{
if (obj == null)
{
return null;
}
var bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, obj);
return ms.ToArray();
}
}
public static T Deserialize<T>(this byte[] byteArray) where T : class
{
if (byteArray == null)
{
return null;
}
using (var memStream = new MemoryStream())
{
var binForm = new BinaryFormatter();
memStream.Write(byteArray, 0, byteArray.Length);
memStream.Seek(0, SeekOrigin.Begin);s
var obj = (T)binForm.Deserialize(memStream);
return obj;
}
}
答案 0 :(得分:2)
我建议您使用DataContractSerializer(此MSDN链接也有关于如何使用属性修饰类的示例)。
然后你可以轻松地(de)将这样的类序列化为二进制形式:
public static byte[] SerializeToByteArray<T>(this T obj) where T : class
{
if (obj == null)
{
return null;
}
using (var ms = new MemoryStream())
{
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(ms, obj);
return ms.ToArray();
}
}
public static T Deserialize<T>(this byte[] byteArray) where T : class
{
if (byteArray == null)
{
return null;
}
using (var memStream = new MemoryStream(byteArray))
{
var serializer = new DataContractSerializer(typeof (T));
var obj = (T) serializer.ReadObject(memStream);
return obj;
}
}
[更新]警告!这仍然不是最佳解决方案,因为您必须在两个应用程序中定义完全相同的类并将它们作为通用参数传递给这些函数
<强> [编辑] 强> 由于您必须使用.net 2.0,因此您需要回退到XMLSerialization。它不如DataContract序列化方便,但它应该工作。这是starting page for this topic on MSDN 下面是序列化/反序列化的代码
public static byte[] SerializeToByteArray<T>(this T obj) where T : class
{
if (obj == null)
{
return null;
}
using (var ms = new MemoryStream())
{
var serializer = new XmlSerializer(typeof(T));
serializer.Serialize(ms, obj);
return ms.ToArray();
}
}
public static T Deserialize<T>(this byte[] byteArray) where T : class
{
if (byteArray == null)
{
return null;
}
using (var memStream = new MemoryStream(byteArray))
{
var serializer = new XmlSerializer(typeof(T));
var obj = (T)serializer.Deserialize(memStream);
return obj;
}
}