在C#中序列化嵌套对象

时间:2016-03-10 02:53:30

标签: c# serialization

我有2个用户定义的类,名为事件图像事件有一个属性存储 EventImage < / em>,名为 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 < / em>,也似乎我失败了。

这是我的代码序列化

    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序列化”的类似问题的答案,但我不确定它是否有用。需要我使用它还是还有其他更好的方法吗?提前谢谢!

1 个答案:

答案 0 :(得分: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);
        }
    }