首页 > 解决方案 > 序列化复杂对象并反序列化为字符串以进行存储 - 它会工作吗?

问题描述

我正在使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 序列化复杂的 Project 对象并将其作为 .dat 文件存储在本地计算机上。然后我可以反序列化这个流并转换为 Project 以获得原始项目的精确副本。(简化)代码如下:

Project project = new Project();
FileStream stream = new FileStream("file.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();

formatter.Serialize(stream, project);
stream.Close();

...

stream = new FileStream("file.dat", FileMode.Open);
Project revisitedProject = (Project)formatter.Deserialize(stream);
stream.Close();

这对我有用,不会丢失数据,因为它应该。但是,这只允许我将项目存储在本地计算机上,因此如果设备丢失或损坏,那么用户的所有项目也是如此。Project 类太复杂,无法存储在表格中,所以我希望对序列化有更多了解的人可以帮助我一点,因为我对这个概念非常陌生。

我想像我已经做的那样序列化项目。

然后,我想反序列化项目并转换为一个字符串,这个字符串将存储在一个表中。

如果项目需要恢复,该字符串将再次序列化并作为 .dat 文件存储在本地计算机中。

然后,如果我反序列化该 .dat 文件并将其转换为 Project,我是否会有原始项目的精确副本,或者将其转换为字符串并将其存储为字符串会导致我丢失数据?

标签: c#databasedeserializationstoragebinary-serialization

解决方案


当您拥有 .dat 文件时,您已经拥有复杂对象的序列化版本,无需将其转换为字符串。所有现代数据库都支持将数据存储为 blob:即没有数据库引擎可以理解的结构的数据。您可以将 .dat 文件的内容存储在数据库中的 blob 字段中。不同的数据库以不同的方式调用此数据类型,例如 MSSQL 调用它varbinary

另外,如果您坚持转换为字符串,请考虑使用 base64 转换二进制文件。它将使编码和解码都安全,而无需担心代码页和语言编码问题。


推荐阅读