c# - 序列化复杂对象并反序列化为字符串以进行存储 - 它会工作吗?
问题描述
我正在使用 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,我是否会有原始项目的精确副本,或者将其转换为字符串并将其存储为字符串会导致我丢失数据?
解决方案
当您拥有 .dat 文件时,您已经拥有复杂对象的序列化版本,无需将其转换为字符串。所有现代数据库都支持将数据存储为 blob:即没有数据库引擎可以理解的结构的数据。您可以将 .dat 文件的内容存储在数据库中的 blob 字段中。不同的数据库以不同的方式调用此数据类型,例如 MSSQL 调用它varbinary
。
另外,如果您坚持转换为字符串,请考虑使用 base64 转换二进制文件。它将使编码和解码都安全,而无需担心代码页和语言编码问题。
推荐阅读
- wordpress - “Laravel”中有什么原因要更新新添加的功能吗?
- apache-spark - 使用 spark 过滤与日志文件中的单词匹配的行时出错
- docker - 如何对接定制的基于 Apache Karaf 服务器的应用程序?
- powershell - Powershell 集合类构造函数
- shell - 将 find 与 printf 和 or 一起使用
- python - 将 x、y、值时间序列插入另一组点的最简单方法是什么?
- android - 粘贴到多个edittext
- tcp - TCP 端口和 OSI 模型
- git - 合并 develop 到 master 使得 commit 在顶部移动
- mysql - 使用 case 语句从 SELECT 更新记录。(mysql)