更新二进制序列化 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 模式经常更改的开发过程中。
我创建了一个汽车 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 模式经常更改的开发过程中。