如何刷新Protobuf-net writer

时间:2014-02-10 19:14:12

标签: c# protobuf-net

我正在使用ProtoWriter / ProtoReader类来实现与Protobuf-net源包含的DataTableSerializer类似的东西。一个区别是在表内容的初始传输之后,所有将来的更新都是逐步序列化的。

目前我没有处理ProtoWriter实例,直到程序结束(因为我希望所有未来的更新都使用同一个编写器进行序列化)。这样可以延迟对输出流的所有写入,直到达到1024字节的内部缓冲区大小。

我应该为每次增量更新创建一个新的ProtoWriter吗?有没有其他方法可以强制写入者写入流?

示例代码:

    private readonly ProtoWriter _writer;

    private void WriteUpdate(IEnumerable<IReactiveColumn> columns, int rowIndex)
    {
        // Start the row group
        ProtoWriter.WriteFieldHeader(ProtobufOperationTypes.Update, WireType.StartGroup, _writer);
        var token = ProtoWriter.StartSubItem(rowIndex, _writer);

        var rowId = rowIndex;

        // Send the row id so that it can be matched against the local row id at the other end.
        ProtoWriter.WriteFieldHeader(ProtobufFieldIds.RowId, WireType.Variant, _writer);
        ProtoWriter.WriteInt32(rowId, _writer);

        foreach (var column in columns)
        {
            var fieldId = _columnsToFieldIds[column.ColumnId];

            WriteColumn(column, fieldId, rowId);
        }

        ProtoWriter.EndSubItem(token, _writer);
    }

1 个答案:

答案 0 :(得分:1)

有趣的问题。 flush方法没有暴露,因为内部并不总是适合刷新,但我想没有一个很大的理由不暴露这个并且让它没有操作。另一方面:

  • 它已经是一个关于流的轻量级包装器:你可以处理并重新创建
  • 或者你可以继续写作并充分利用额外的缓冲