C# FlatBufferBuilder 从流创建字符串
C# FlatBufferBuilder create String from Stream
假设您需要从流中读取一个大字符串并且您想将该字符串放入平面缓冲区。
目前我所做的是将流读入一个字符串,然后使用 FlatbufferBuilder.CreateString(string s) 函数。
这很好用,但它确实有一个缺点,即字符串被复制并加载到内存中两次:一次是从流中将其读入字符串;另一次是从流中读取字符串。然后第二次将字符串复制到平面缓冲区中。
我想知道是否有办法直接从流中填充 flatbuffer 字符串?
更具体的例子:
假设您的平面缓冲区架构如下所示:
table Message
{
_Data: string;
}
root_type Message;
然后我们可以像这样创建一个平面缓冲区(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?
显然下面的工作,但我想避免首先将流读入内存。
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 并得到结果。
假设您需要从流中读取一个大字符串并且您想将该字符串放入平面缓冲区。
目前我所做的是将流读入一个字符串,然后使用 FlatbufferBuilder.CreateString(string s) 函数。
这很好用,但它确实有一个缺点,即字符串被复制并加载到内存中两次:一次是从流中将其读入字符串;另一次是从流中读取字符串。然后第二次将字符串复制到平面缓冲区中。
我想知道是否有办法直接从流中填充 flatbuffer 字符串?
更具体的例子: 假设您的平面缓冲区架构如下所示:
table Message
{
_Data: string;
}
root_type Message;
然后我们可以像这样创建一个平面缓冲区(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?
显然下面的工作,但我想避免首先将流读入内存。
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 并得到结果。