首页 > 解决方案 > 序列化和反序列化数据的正确方法?

问题描述

我有一个类数据数组,我将其序列化为字节数组,然后将其推送到数据库中。该程序在夜间按计划运行。另一方面,我有另一个程序将这些数据从数据库中提取出来,将其处理成报告——或者至少这是计划。该类包含在 2 个命名空间中,第一个是应用程序名称,第二个只是用来保存我的结构的东西。比如下面。

namespace FibreTrend
{
    namespace Structures
    {
        [Serializable]
        public class Trend
        {
            public Trend(DateTime date, string ref, int port)
            {
                Date = date;
                Reference = ref;
                PortNo = port;
            }

            public DateTime Date;
            public string Reference;
            public int PortNo;
        }
    }
}


{
    // Function to take the trendData list, convert it to a byte array
    // List<Structures.Trend> trendData;
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream mStream = new MemoryStream())
    {
         bf.Serialize(mStream, trendData.ToArray());
         byte[] b = mStream.ToArray();
         // code that pushes the array into the database...
    }
}

我有一个完全独立的应用程序,它从数据库中读取数据作为字节数组。然后我将它从字节转换回我的数据类。

using (MemoryStream mStream = new MemoryStream())
{
    BinaryFormatter binaryFormat = new BinaryFormatter();
    mStream.Write(data, 0, data.Length);
    mStream.Seek(0, SeekOrigin.Begin);

    Structures.Trend[] obj = (Structures.Trend[])binaryFormat.Deserialize(mStream);
}

这是我的错误。它告诉我它希望 FibreTrend 二进制文件反序列化数据。为什么??我的趋势类是相同的大小,相同的数据布局,它是从我的其他项目中精确复制和粘贴的。为什么它坚持需要我的其他二进制文件在伴侣中。当我确实将二进制文件与它一起放入时,然后将其反序列化为一个对象,它以 FibreTrend.Structures.Trend[] 的形式出现。我显然不会包含其他二进制文件,我也不会双重处理将其转换为 Report.Structures.Trend[] 的数据。它只是一个 1 和 0 的流,为什么我不能将它推送到我认为我想要的任何类中,这不是演员表的目的是告诉编译器我希望数据如何排序和结构化吗?

标签: c#serialization

解决方案


二进制序列化数据流包含一个带有类型信息的标头。您可以在此处参考二进制格式数据结构。这就是为什么您会收到有关缺少程序集的异常。

解决您的问题的一种方法是实现 a SerializationBinder,它在运行时覆盖要反序列化的类型并将Binder属性设置为 on BinaryFormatter是一个很好的例子。

首选的解决方案是使用替代的序列化格式,例如 XML、JSON。


推荐阅读