繁体   English   中英

C# FlatBufferBuilder 从流创建字符串

[英]C# FlatBufferBuilder create String from Stream

假设您需要从流中读取一个大字符串,并且您想将该字符串放入一个 flatbuffer 中。

目前我所做的是将流读入一个字符串,然后使用 FlatbufferBuilder.CreateString(string s) 函数。

这工作正常,但它确实有一个缺点,即字符串被复制并加载到内存中两次:一次是通过将它从流中读取到字符串中; 然后第二次将字符串复制到 flatbuffer 中。

我想知道是否有办法直接从流中填充 flatbuffer 字符串?

对于更具体的示例:假设您的 flatbuffer 架构如下所示:

table Message
   {
   _Data: string;
   }

root_type Message;

然后我们可以像这样创建一个 flatbuffer(用 myData 一个字符串)

var fbb = new FlatBufferBuilder(myData.Length);
var dataOffset = fbb.CreateString(myData);
var message = Message.CreateMessage(fbb, dataOffset);
Message.FinishMessageBuffer(fbb, message);

所以问题是我们能否以某种方式做同样的事情,其中​​ myData 是 System.IO.Stream?

显然以下有效,但我想避免首先将 Stream 读入内存。

using (var reader = new StreamReader(myStream)
{
  var myData = reader.ReadToEnd();
  var fbb = new FlatBufferBuilder(myData.Length);
  var dataOffset = fbb.CreateString(myData);
  var message = Message.CreateMessage(fbb, dataOffset);
  Message.FinishMessageBuffer(fbb, message);
}

目前没有办法避免该副本两次,afaik..实现一个版本的CreateString应该相对简单,该版本接受一个流并将其减少到一个副本。 你可以尝试一下,然后在 github 上打开一个 PR 并得到结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM