【问题标题】:Updating properties of binary Serialized class c# .NET effectively corrupts files更新二进制序列化类 c# .NET 的属性会有效地破坏文件
【发布时间】:2020-12-09 16:55:16
【问题描述】:

我创建了一个 Car 类,我用它来存储 Cars 的预设序列化版本以及它们所有的各种属性以及你有什么。

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

如何在不使之前的所有文件失效的情况下更新我的课程?

-- 点击率

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

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

}

【问题讨论】:

  • 那么不要使用二进制序列化?
  • 你是如何反序列化的?
  • 请发布您的代码
  • 使用 json 序列化并忽略不存在的属性
  • 我必须为此特定目的使用二进制序列化。我不能使用 JSON。我只是使用内置的 [Serializable] 属性。我将发布一个代码示例,这似乎没有必要,因为它对我来说似乎纯粹是理论上的,抱歉。

标签: c# .net serialization binaryformatter


【解决方案1】:

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

这与也写入模式的序列化程序不同,后者将写入 4 个字节以及字段名称,因此稍后反序列化程序可以混合和匹配。可以想象,它速度较慢,但​​更灵活。

只要您坚持使用前者,就不要更改架构。你不能用它做很多其他事情。

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

【讨论】:

  • 谢谢你,我完全不知道。知道这一点非常有用。我已经查看了 MSDN 上的 ISerializer 接口:docs.microsoft.com/en-us/dotnet/api/… 我认为,即使二进制是无模式的,我也可以放入自己的捕获并解决这些问题?
  • 您可以接管自动流程并实施您自己的流程,这是正确的。但是,您会遇到的一个问题是您也没有丢失的信息,您不知道您是否正在反序列化具有 car 属性的版本。当您对类型进行更多更改时,情况只会变得更糟。
  • 感谢 Blindy,这些都是很好的观点。感谢其他所有人,我现在很可能会更改我的解决方案:)
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 2019-01-22
  • 2015-03-02
  • 2017-01-08
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多