序列化和反序列化数据的正确方法?

时间:2019-04-08 06:00:06

标签: c# serialization

我有一个类数据数组,将其序列化为字节数组,然后将其推入数据库。该程序在夜间按计划运行。在另一端,我有另一个程序可以将这些数据从数据库中提取出来,并将其处理为报告-至少这是计划。 该类有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的流,为什么我不能将其推入我认为我想要的任何类中,这不是强制转换的目的,是告诉编译器我希望如何对数据进行排序和结构化? >

1 个答案:

答案 0 :(得分:1)

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

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

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