繁体   English   中英

在C#中序列化嵌套对象

[英]Serialize nested objects in C#

我有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 [] ,并且我希望它的全部内容也可以序列化 ,但是看来我失败了。

这是我执行序列化的代码:

    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));

结果是(只是假设值):100200300

但我希望结果应该是600(100 + 200 + 300),500(200 + 300)和300。

所以,我认为我的序列化并没有真正序列化整个内容,它只是序列化了具有Basic Types的属性,但是没有嵌套的对象,对吗?

我搜索了很多帖子,找到了许多类似“ XML序列化”的类似问题的答案,但是我不确定它是否有用。 我需要使用它还是有其他更好的方法? 提前致谢!

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

正确地序列化和反序列化。

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

    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);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM