【问题标题】:Serialize nested objects in C#在 C# 中序列化嵌套对象
【发布时间】:2016-03-10 02:53:30
【问题描述】:

我有 2 个用户定义的类,分别称为 EventImageEvent 有一个属性存储了 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


【解决方案1】:

快速进行测试以检查相等性。它通过了。

正确序列化和反序列化。

结论,在你测试之前不要判断事情是否正在发生。

    public static void Run()
    {
        var i = new Image
        {
            ImageTime = DateTime.UtcNow,
            pData = Guid.NewGuid().ToByteArray()
        };

        var e = new Event
        {
            Name = Guid.NewGuid().ToString(),
            EventTime = DateTime.UtcNow,
            EventImages = new List<Image> {i}
        };

        var bytes = ObjectToByteArray(e);
        var e2 = ObjectFromByteArray(bytes);

        Console.WriteLine(e.Equals(e2));
    }

    public static byte[] ObjectToByteArray(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 object ObjectFromByteArray(byte[] bytes)
    {
        if (bytes == null)
        {
            return null;
        }

        var bF = new BinaryFormatter();
        using (var mS = new MemoryStream(bytes))
        {
            return bF.Deserialize(mS);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多