.net 故障安全序列化

.net 故障安全序列化,.net,serialization,protobuf-net,.net,Serialization,Protobuf Net,好的,我们正在序列化/反序列化某些内容,但是当您处理重要数据时, 您需要了解舒尔是否100%正确序列化/反序列化了对象。例如,假设您的应用程序在序列化过程中死亡/被强制关闭。。在大多数情况下,您将得到损坏的对象,这对我来说是不可接受的,我不主张我可以手动备份文件并写入标志,在开始序列化之前lke UNMICTED,在进程结束时添加标志commited,如果在反序列化期间文件未被限制,则从备份中获取文件。这并不好,因为每次更改后我都要备份非常大的文件。在.NET Framework或protobu

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

序列化与此无关。您实际的问题是:如何将一组数据原子地写入磁盘?以下是一些选项:

  • 如果数据足够小,可以装入单个磁盘群集(512字节或4K),请使用
    文件标志(FILE FLAG)写入(u-WRITE)到|文件标志(u-NO)缓冲
    在一次写入调用中自动写入单个磁盘扇区
  • 使用事务性NTFS以原子方式写入任意数量的数据
  • 写入
    .tmp
    文件,并自动重命名为所需的文件名
  • 使用其他方法实现原子性,如数据库(甚至可能是SqlLite、Esent等)或Windows的CLF

  • 不。如果“非常大的文件”是您的问题,那么您显然需要移动到数据库。它支持事务。IMO您可以将序列化从这个问题中剥离出来:首先序列化-现在您有了数据:如何以故障保护的方式原子地改变数据?这是一个众所周知的问题,像RDBMS这样的人非常了解它。@HansPassant是的,事务。不幸的是,这是一个很大的旧应用程序,由于内部原因,他们不会切换到数据库,这存在性能问题。对于原始数据,序列化程序要快得多data@MarcGravell现在我们就是这样做的……我们对对象使用未限制/提交的标志。但这不是很方便,而且我们有时会遇到bug。。在序列化程序中最好有一些类似于可选事务的东西:)。我认为这是可能的,但需要一些开销。“序列化程序中的事务”到底是什么意思?