序列化一个复杂的对象并反序列化为字符串进行存储 - 它会起作用吗?
Serializing a complex object and Deserializing as string for storage - Will it work?
我正在使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 序列化一个复杂的项目对象并将其作为 .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();
这对我来说没有数据丢失,这是应该的。但是,这只允许我将项目存储在本地机器上,因此如果设备丢失或损坏,那么用户的所有项目也会丢失或损坏。项目 class 太复杂,无法存储在 table 中,所以我希望对序列化有更多了解的人可以帮助我,因为我对这个概念还很陌生。
我想像现在一样连载该项目。
然后,我想反序列化项目并转换为字符串,这个字符串将存储在table。
如果项目需要恢复,该字符串将再次序列化并作为 .dat 文件存储在本地计算机中。
然后,如果我反序列化该 .dat 文件并将其转换为 Project,我是否会得到原始项目的精确副本,或者转换并存储为字符串是否会导致我丢失数据?
当您拥有 .dat 文件时,您已经拥有复杂对象的序列化版本,无需将其转换为字符串。所有现代数据库都支持将数据存储为 blob:即没有数据库引擎可以理解的结构的数据。您可以将 .dat 文件的内容存储在数据库中的 blob 字段中。不同的数据库以不同的方式调用这种数据类型,例如MSSQL 调用它 varbinary
.
补充一下,如果你非要转成字符串,可以考虑用base64转二进制。它将使编码和解码都安全,没有代码页和语言编码问题。
我正在使用 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 序列化一个复杂的项目对象并将其作为 .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();
这对我来说没有数据丢失,这是应该的。但是,这只允许我将项目存储在本地机器上,因此如果设备丢失或损坏,那么用户的所有项目也会丢失或损坏。项目 class 太复杂,无法存储在 table 中,所以我希望对序列化有更多了解的人可以帮助我,因为我对这个概念还很陌生。
我想像现在一样连载该项目。
然后,我想反序列化项目并转换为字符串,这个字符串将存储在table。
如果项目需要恢复,该字符串将再次序列化并作为 .dat 文件存储在本地计算机中。
然后,如果我反序列化该 .dat 文件并将其转换为 Project,我是否会得到原始项目的精确副本,或者转换并存储为字符串是否会导致我丢失数据?
当您拥有 .dat 文件时,您已经拥有复杂对象的序列化版本,无需将其转换为字符串。所有现代数据库都支持将数据存储为 blob:即没有数据库引擎可以理解的结构的数据。您可以将 .dat 文件的内容存储在数据库中的 blob 字段中。不同的数据库以不同的方式调用这种数据类型,例如MSSQL 调用它 varbinary
.
补充一下,如果你非要转成字符串,可以考虑用base64转二进制。它将使编码和解码都安全,没有代码页和语言编码问题。