gpt4 book ai didi

c# - 如何在c#中序列化和反序列化一个以字节数组作为成员的类

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:50 31 4
gpt4 key购买 nike

我正在尝试以字节流的形式在两个进程之间发送数据,这对几乎所有类都工作正常,但我遇到的一个问题是,如果对象的类内部有一个字节数组,反序列化就会失败它并给我一个错误,指出无法加载发生序列化的程序集。我不能在此处包含程序集,因为发送方和接收方是不同的应用程序。

有办法解决这个问题吗?

编辑:很抱歉事实证明即使是普通类也无法在另一端反序列化

编辑: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;
}
}

use return default(T); instead of return null; , because T might be non-nullable
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/default

[更新] 警告!这仍然不是最好的解决方案,因为您必须在两个应用程序中定义完全相同的类并将它们作为通用参数传递给这些函数

[编辑]由于您必须使用 .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;
}
}

关于c# - 如何在c#中序列化和反序列化一个以字节数组作为成员的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23468552/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com