我试图以字节流的形式,它做工精细,几乎所有的课,但我有一个问题是,如果类对象的内部具有字节数组,并给出了deserilization失败2个工序之间发送数据我的错误,说明其中serilization发生的组件无法加载。 我可以不包括组件在这里,因为发送者和接收者是不同的应用程序。
有没有办法解决这个问题?
编辑:对不起事实证明,即使是正常的类不能在另一端反序列化
编辑:而且应用了2的一个使用的.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;
}
}
我建议你使用的DataContractSerializer (这个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 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序列一样方便,但它应该工作。 下面是在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;
}
}