C# 如何存储不同类型的数据';它在一个文件中? 问题

C# 如何存储不同类型的数据';它在一个文件中? 问题,c#,file-io,containers,C#,File Io,Containers,对于我当前的项目,我需要将图像、序列化对象等存储在具有下划线文件结构的单个文件中。由于我的php背景,整个过程对我来说都是新的 问题: 关于这一主题,什么是好的读物?对于这类事情,什么是“最佳实践” 评论 用户应该仍然能够操作数据,我他/她喜欢。如果用户无法修补文件,则应使用某种形式的文本文件(而不是二进制文件) 对于像您这样的任务,有两种非常流行的文件格式:XML和JSON。对于这两种文件格式,都存在大型和丰富的库 固有的二进制数据(如图片)需要序列化为某种文本格式(如base64),然后才能

对于我当前的项目,我需要将图像、序列化对象等存储在具有下划线文件结构的单个文件中。由于我的php背景,整个过程对我来说都是新的

问题: 关于这一主题,什么是好的读物?对于这类事情,什么是“最佳实践”

评论
用户应该仍然能够操作数据,我他/她喜欢。

如果用户无法修补文件,则应使用某种形式的文本文件(而不是二进制文件)

对于像您这样的任务,有两种非常流行的文件格式:XML和JSON。对于这两种文件格式,都存在大型和丰富的库

固有的二进制数据(如图片)需要序列化为某种文本格式(如base64),然后才能将其作为单个元素添加到此类文件中

这些文件可以通过简单的文本编辑器进行编辑。

当我需要这样的“保存文件”时,首先我将对象的类型存储为1字节,然后将对象长度存储为4字节(二进制int),然后将整个对象存储为二进制。如果需要,可以在序列化对象的顶部添加加密,并将其编码到阅读器中

System.IO.BinaryWriter
System.IO.BinaryReader
在这方面非常出色

首先将int转换为4字节,将其写入savefile,将要保存的objecttype的枚举值转换为字节,将其写入文件,然后写入序列化对象

打开保存的对象时,只需从保存文件的开头开始,您就知道需要读取4个字节来获取对象长度,读取一个字节来获取类型,然后读取与第一次读取长度相同的字节数。读取完该对象后,savefile中的指针将指向下一个对象的新的4字节整数。
继续,直到您到达文件的末尾,然后开始:)

为此,您将使用具有属性的对象类来包含所需的各个项目类型

创建网页/windows窗体等,加载屏幕上每个对象属性的数据,允许用户更改数据(文本、数字、图像等)

将这些值存储在对象实例中,然后将其序列化(例如作为二进制或XML),并保存到文件中

然后可以加载该文件并再次将其反序列化到对象实例中,以显示并允许编辑

然而,在看到您的编辑后

用户如何编辑文本文件中的图像?您确定要将序列化数据存储在用户可以手动编辑的文件中吗


即使使用zip文件,用户也可以完全破坏您认为存在的任何结构。如果您可以详细介绍他们存储的内容、他们可以编辑的数据部分以及这些编辑包含的内容,您可能会更容易发现您的问题。

用户仍然能够操作数据是什么意思?是否直接编辑生成的文件?他们将如何编辑保存在那里的序列化对象或图像?我曾想过使用zip文件作为容器,内容仍然可以编辑,用户只需覆盖现有文件,即xml仍然是纯文本,图像仍然是图像。zip或类似的存档不是一个坏主意。看看这个github项目,了解相关的想法(虚拟文件系统):我可能会采用Platform.VirtualFileSystem方法,谢谢@david tansey。如果您愿意,将您的建议添加到答案中,您可以获得一些推荐;)这将导致二进制文件不再以简单的方式(例如文本编辑器)进行编辑。这不符合用户应该能够操作/编辑数据的要求,我提供了一个单独的编辑器。使用此解决方案操作数据仍应在您的项目中执行,而不是直接在文件上执行。如果这是你编辑所需要的,我不太确定你应该如何存储图像:-\但是如果你对编辑器进行编码,你可以用同样的方式打开文件,在编辑器中编辑对象,然后以同样的方式保存。这将是一个解决有许多失败点的问题的方法,但是我已经设计了一个备用方法,如果有任何东西出现了问题。但如果用户做错了什么,它无法完全防止数据损坏。但这其实不是我的问题;)那么,XML或JSON可能就是最好的选择。使用基本编码图像。该文件在任何文本编辑器中都非常可读。只需将编写器从二进制编写器更改为编写json数据即可。谷歌上到处都有json和xml的解析器:)正如我对主要问题的评论,我更喜欢使用一种用户友好的容器,即zip文件或类似的东西。是的,但这会迫使用户使用其他软件(例如WinZip)操作文件。Windows有内置的zip功能,也就是说,这不会是一个问题。嗯,我是那种人,如果用户自己弄坏了什么东西,那么这不是系统的错,也不是我的错。但您的方法可能适合DAU(最愚蠢的假定用户)方法,我实际上认为用户能够在不破坏数据的情况下操纵数据;)