【发布时间】:2016-03-10 02:53:30
【问题描述】:
我有 2 个用户定义的类,分别称为 Event 和 Image,Event 有一个属性存储了 EventImage,称为 EventImages。而在 Image 类中,有一个 byte[] 类型的属性,用来存储一个 Image 文件的 byte[]。
这是 2 个类的定义:
[Serializable]
public Class Event
{
public String Name {get; set;}
public DateTime EventTime { get; set;}
public List<Image> EventImages { get; set; }
...
}
[Serializable]
public Class Image
{
public DateTime ImageTime { get; set;}
public byte[] pData {get; set;}
...
}
现在我的问题是,我想将我的 Event 对象序列化为 byte[],我希望它的全部内容将是 serialize 也是,但似乎我失败了。
这是我的代码序列化:
public static byte[] ObjectToByteArray(object obj)
{
if (obj == null)
{
return null;
}
else
{
BinaryFormatter bF = new BinaryFormatter();
using (MemoryStream mS = new MemoryStream())
{
bF.Serialize(mS, obj);
return mS.ToArray();
}
}
}
这是验证代码:
Console.WriteLine(ObjectToByteArray(Event));
Console.WriteLine(ObjectToByteArray(Event.EventImage));
Console.WriteLine(ObjectToByteArray(Event.EventImages.FirstOrDefault().pData));
结果是(只是假设值): 100 200 300
但我预计结果应该是 600(100+200+300)、500(200+300) 和 300。
所以,我认为我的 序列化 并没有真正 序列化 整个内容,它只是序列化具有基本类型的属性,但没有嵌套对象,对吗?
我搜索了很多帖子,找到了很多关于“XML 序列化”的类似问题的答案,但我不确定它是否有用。我需要使用它还是有其他更好的方法?提前致谢!
【问题讨论】:
-
问题,您打算在某个时候反序列化对象还是出于其他目的?您是否尝试过反序列化对象并根据第一个对象检查内容?旁注 - (意见)似乎社区通常正在远离二进制序列化,除非有特定的理由使用它。如果您使用 JSON 序列化程序,这些问题更容易调试,因为您可以在 JSON 输出中直接看到数据。尝试使用 JSON.NET newtonsoft.com/json 对其进行序列化并查看生成的文件。
-
@drobertson 感谢您的建议!我以前使用过 JSON 格式,我认为这也是序列化和传输数据的魅力。但我需要这样做的原因是我需要使用一些特定的库,它只接收 byte array 格式。我还没有尝试反序列化结果,我稍后会尝试,希望可以帮助。谢谢!
-
看看你的代码,它很教科书。我没有看到二进制序列化显然会失败的任何区域。解释字节数组输出完全是另一回事。那只会让我头疼。请记住,二进制序列化程序不仅仅将数据存储在一个大块中,它内部还有元数据属性来描述如何重构数据。你正在用那个看香肠工厂。
-
从您上面的评论中我想到了一件事情。您正在使用一个需要字节数组格式的库。这种格式是否有规范,或者它是否专门要求来自二进制序列化对象的字节数组。这是一个相当奇怪的事情,除非它是一个本土的解决方案。也就是说,我将它们用于数据目的,但字节数组数据总是围绕数据规范构建的。二进制序列化输出不符合规范。
-
@drobertson 好吧,我不确定 textbook 是什么意思……我的代码太简单了吗?实际上,我也看不到任何可能导致代码错误的部分。谢谢你的提及!我认为关于 byte[] 我需要了解很多,正如您所说,解释字节数组输出完全是另一回事,也许我应该寻找其他方法,谢谢!
标签: c# serialization