如何序列化和反序列化一个以字节数组为成员的类

本文关键字:数组 成员 字节数 字节 序列化 反序列化 一个以 | 更新日期: 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;
    }
}