更新二进制序列化 class 的属性 c# .NET 有效地破坏了文件

Updating properties of binary Serialized class c# .NET effectively corrupts files

我创建了一个汽车 class,我用它来存储汽车的预设序列化版本及其各种属性以及你有什么。

随着我的程序的进行,我意识到如果我添加或删除 属性 的汽车,每个以前序列化的文件现在都不可读。你可以想象,这是一个问题。

如何更新我的 class 而不会使所有以前的文件失效?

-- 点击

更新:我已经添加了我正在做的事情的代码示例 如果我 add/remove a 属性 并尝试反序列化文件,就会出现问题。

using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
using System;


namespace MyCars
{

    [Serializable]
    public class Car
    {
        public string Name { get; set; }
        public double TopSpeed { get; set; }

        public Car(string name, double topspeed)
        {
            Name = name;
            TopSpeed = topspeed;
        }
    }


    public static class Serializer
    {
        public static bool LoadCar(string filePath, out Car car)
        {
            Stream TestFileStream = File.OpenRead(filePath);
            BinaryFormatter serializer = new BinaryFormatter();

            try
            {
                car = (Car)serializer.Deserialize(TestFileStream);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Could not deserialize");
                TestFileStream.Close();
                car = null;
                return false;
            }

            return true;
        }

        public static bool SaveCar(string filePath, Car car)
        {
            Stream TestFileStream = File.Create(filePath);
            BinaryFormatter serializer = new BinaryFormatter();
            serializer.Serialize(TestFileStream, car);
            TestFileStream.Close();

            return true;
        }
    }

}

二进制序列化,由 System.Runtime.Serialization.Formatters.Binary 实现,是一种无模式二进制格式。这意味着如果序列化程序看到一个 int 字段,它会在文件中写入 4 个字节,与所有其他支持的类型一样。速度很快,但不够灵活。

这与同时写入架构的序列化程序不同,后者会写入 4 个字节以及字段名称,因此稍后反序列化程序可以混合和匹配。正如您所想象的,它速度更慢但更灵活。

只要您坚持使用前者,就不要更改架构。您无能为力。

这就是为什么每个人都会(并且已经)推荐使用模式序列化程序,例如 JSON、BSON(二进制 json)、Google 的 proto-buf 、XML、Sql 或 Nosql 数据库,以及其他任何东西,尤其是在 class 模式经常更改的开发过程中。