【问题标题】:Fail safe serialization故障安全序列化
【发布时间】:2013-12-21 10:32:39
【问题描述】:

好的,我们对某些内容进行序列化/反序列化,但是当您处理人们的重要数据时, 您需要确保对象在 100% 上正确序列化/反序列化。例如,假设您的应用程序在序列化期间死亡/被强行关闭。在大多数情况下,您会得到损坏的对象,这对我来说是不可接受的,我不知道我可以手动备份文件并写入标志, lke 在开始序列化之前未提交,并在进程结束时添加已提交标志,如果在反序列化期间未提交,则从备份中获取文件。这不好,因为每次更改后我都必须备份非常大的文件。 .NET Framework 或 protobuf 中流行的序列化程序中是否有一些内置的故障安全逻辑?我找不到任何关于故障安全序列化的信息。 或者你能告诉我一些好的模式如何使序列化失败安全吗?

【问题讨论】:

  • 没有。如果“非常大的文件”是您的问题,那么您显然需要转移到数据库。支持交易。
  • IMO 你可以解决这个问题的序列化:首先序列化 - 现在你有了数据:如何以故障安全的方式原子地改变数据?这是一个众所周知的问题,像 RDBMS 这样的人非常了解。
  • @HansPassant 是的,交易。不幸的是,这是一个很大的旧应用程序,由于内部原因,他们不会切换到数据库,存在性能问题。序列化器处理原始数据要快得多
  • @MarcGravell 现在我们正在这样做......我们正在为对象使用未提交/已提交标志。但这不是很方便,而且我们不时会遇到错误。在序列化程序中拥有像可选事务这样的东西会很高兴:)。我认为这可以通过一些开销来实现。
  • @Brans “序列化程序中的事务”甚至是什么意思

标签: .net serialization protobuf-net


【解决方案1】:

序列化与此无关。您的实际问题是:如何将一堆数据原子地写入磁盘?这里有几个选项:

  1. 如果数据小到足以放入单个磁盘集群(512 字节或 4K),请使用 FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING 在单个写入调用中以原子方式写入单个磁盘扇区。
  2. 使用事务性 NTFS 以原子方式写入任意数量的数据。
  3. 写入.tmp 文件并自动重命名为所需文件名
  4. 使用其他方法来实现原子性,例如数据库(甚至可能是 SqlLite、Esent 等)或 Windows 的 CLFS。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多