如何序列化和反序列化一个以字节数组为成员的类
本文关键字:数组 成员 字节数 字节 序列化 反序列化 一个以 | 更新日期: 2023-09-27 18:01:36
我试图以字节流的形式在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 default(T);
}
using (var memStream = new MemoryStream(byteArray))
{
var serializer = new DataContractSerializer(typeof (T));
var obj = (T) serializer.ReadObject(memStream);
return obj;
}
}
使用
return default(T);
而不是return null;
,因为T可能不可为空
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/default
( ]警告!这仍然不是最好的解决方案,因为您必须在两个应用程序中定义完全相等的类,并将它们作为泛型参数传递给这些函数
[编辑]因为必须使用。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;
}
}