Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化一个复杂的对象并反序列化为存储字符串-它会工作吗?_C#_Database_Deserialization_Storage_Binary Serialization - Fatal编程技术网

C# 序列化一个复杂的对象并反序列化为存储字符串-它会工作吗?

C# 序列化一个复杂的对象并反序列化为存储字符串-它会工作吗?,c#,database,deserialization,storage,binary-serialization,C#,Database,Deserialization,Storage,Binary Serialization,我正在使用System.Runtime.Serialization.Formatters.Binary.BinaryFormatter序列化复杂的项目对象,并将其作为.dat文件存储在本地计算机上。然后我可以反序列化这个流并将其转换为Project,以获得原始项目的精确副本。(简化)代码如下: Project project = new Project(); FileStream stream = new FileStream("file.dat", FileMode.Create); Bina

我正在使用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();
这对我来说是有效的,不会丢失数据,这是应该的。但是,这只允许我将项目存储在本地计算机上,因此,如果设备丢失或损坏,那么用户的所有项目也会丢失或损坏。项目类太复杂,无法存储在表中,因此我希望有更多序列化知识的人能帮我一点忙,因为我对这个概念非常熟悉

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

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

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


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

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


作为加法,如果您坚持转换为String,请考虑使用Base64转换二进制。它将使编码和解码安全,无需考虑代码页和语言编码问题。

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


作为加法,如果您坚持转换为String,请考虑使用Base64转换二进制。它将使编码和解码都安全,无需考虑代码页和语言编码问题。

您是否考虑过像MongoDB、CosmosDB或RavenDB这样的文档数据库?此外,您的数据是否真的太复杂而无法存储在关系数据库中?当然,它可能需要多个表,但这是意料之中的。JSON。您是否考虑过像MongoDB、CosmosDB或RavenDB这样的文档数据库?此外,您的数据是否真的太复杂而无法存储在关系数据库中?当然,它可能需要多个表,但这是意料之中的。JSON。虽然这是事实,但我认为序列化类以存储在关系数据库中是一种糟糕的做法+1因为就如何存储序列化数据而言,这是正确的答案。@john:大体上我同意。我们不知道确切的情况。也许它需要付出太多的努力才能获得相对较低的二进制序列化成本。可能存在安全问题和错误的解决方法。可能需要在不共享数据库的情况下共享.dat文件。OP说,这是为了备份。我也会考虑版本控制。虽然这是事实,但我认为序列化类以存储在关系数据库中是一种糟糕的做法+1因为就如何存储序列化数据而言,这是正确的答案。@john:大体上我同意。我们不知道确切的情况。也许它需要付出太多的努力才能获得相对较低的二进制序列化成本。可能存在安全问题和错误的解决方法。可能需要在不共享数据库的情况下共享.dat文件。OP说,这是为了备份。我也会考虑版本控制。