如何序列和反序列化以字节数组的一类,如C#中的构件(How to serialize and des

2019-10-20 02:11发布

我试图以字节流的形式,它做工精细,几乎所有的课,但我有一个问题是,如果类对象的内部具有字节数组,并给出了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;
    }
}

Answer 1:

我建议你使用的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;
        }
    }


文章来源: How to serialize and deserialize a class with byte array as a member in c#