【问题标题】:How to store data of different type's in one single file?如何将不同类型的数据存储在一个文件中?
【发布时间】:2015-03-07 14:46:55
【问题描述】:

问题

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

问题

什么是该主题的好读物?什么是这类事情的“最佳实践”?

备注

用户应该仍然能够操作数据,只要他/她喜欢。

【问题讨论】:

  • 用户应该仍然能够操作数据是什么意思?直接编辑生成的文件?他们将如何编辑保存在那里的序列化对象或图像?
  • 我想使用一个 zip 文件作为容器,内容仍然是可编辑的,用户只需覆盖现有文件,即 xml 仍然是纯文本,图像仍然是图像.
  • ZIP 或类似的存档不是一个坏主意。看看这个github项目的相关思路(虚拟文件系统):github.com/platformdotnet/Platform.VirtualFileSystem
  • 我可能会采用 Platform.VirtualFileSystem 方法,谢谢@david-tansey。如果您愿意,请将您的建议添加到答案中,您可以获得一些代表;)

标签: c# file-io containers


【解决方案1】:

如果您希望用户能够修补文件,您应该使用某种形式的文本文件(而不是二进制文件)。

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

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

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

【讨论】:

  • 正如我对主要问题的评论,我更喜欢使用一种用户友好的容器,即 zip 文件或类似的东西。
  • 嗯,是的,但这会迫使您的用户使用其他软件(例如 WinZip)来操作文件。
  • Windows 有内置的 zip 功能,也就是说,这不会是一个问题。
【解决方案2】:

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

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

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

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

但是,在看到您的编辑之后...

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

即使使用 zip 文件,用户也可以完全破坏您认为存在的任何结构。如果您可以扩展他们存储的内容以及他们可以编辑的数据的哪一部分以及这些编辑的内容,那么可能会更容易发现您的问题。

【讨论】:

  • 好吧,我是那种人,如果用户自己破坏了某些东西,那么这不是系统的错,也不是我的错。但是您的方法可能适合 DAU(最愚蠢的假定用户)方法,我实际上认为用户能够在不破坏内容的情况下操纵数据;)
【解决方案3】:

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

System.IO.BinaryWriterSystem.IO.BinaryReader 非常适合这一点。

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

打开保存的对象时,从保存文件的开头开始,你知道你需要读取4个字节来获取对象长度,1个字节来获取类型,然后只需读取与你第一次一样多的字节阅读长度。完成读取该对象后,保存文件中的指针将位于下一个对象的新 4 字节整数处。 继续直到到达文件的末尾,然后就可以了:)

【讨论】:

  • 这将导致 binary 文件不再以简单的方式(例如文本编辑器)编辑
  • 这不符合用户应该能够操作/编辑数据的要求,我提供了一个单独的编辑器。
  • 使用此解决方案操作数据仍应在您的项目中执行,而不是直接在文件中执行。如果这是您编辑所需的,我不太确定应该如何存储图像:-\ 但是如果您对编辑器进行编码,则以相同的方式打开文件,在编辑器中编辑对象,然后以相同的方式保存。
  • 这对于有很多故障点的事情来说是一个解决方案,但我已经设计了备用方案,以防出现任何问题。但是,如果用户做错了什么,它不会完全防止损坏的数据。但这实际上不是我的问题;)
  • 那么 XML 或 JSON 可能是要走的路。使用基本编码图像。然后该文件在任何文本编辑器中都非常可读。只需将写入器从二进制写入器更改为写入 json 数据即可。 google 周围散布着 json 和 xml 的解析器 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2012-09-25
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多