将旧缓冲区封装在新缓冲区中
encapsulate an old buffer in a new one
所以我有这样的方案:
table Request {
a:Sample;
b:Sample;
}
其中 table Sample 有多个字符串向量,并且它的实例非常大。
我的文件系统上有很多带有 Sample 实例的文件,这花了我一些时间来创建。
现在我想随机取2个文件,将它们读入内存并创建一个封装它们的新请求。
我正在使用 C#,这一行有效:
var a = Sample.GetRootAsSample(new ByteBuffer(System.IO.File.ReadAllBytes(pathToA)));
var b = Sample.GetRootAsSample(new ByteBuffer(System.IO.File.ReadAllBytes(pathTob)));
但我似乎找不到在新的 Request 实例中引用它们的方法。
我需要一些方法将这些缓冲区按原样添加到新的构建器中,然后将它们的偏移量传递给同一个构建器中的新请求。
在新的构建器中重新构建它们效率不高。
我怎样才能做到这一点?
目前无法在 C# 中自动深度复制 table。由于 tables 可能引用缓冲区中的各种位置,这不是一个微不足道的操作,它需要专用代码生成或反射。
C++ 中有一个使用反射的 CopyTable
。这可以移植到 C# 或从 C# 调用。
另一种方法是将现有缓冲区以二进制形式包含在新 table 中,即使 a
和 b
成为 ubytes 向量。这意味着您必须调用 GetRootAs
才能访问它们,但这仍然非常有效。
所以我有这样的方案:
table Request {
a:Sample;
b:Sample;
}
其中 table Sample 有多个字符串向量,并且它的实例非常大。 我的文件系统上有很多带有 Sample 实例的文件,这花了我一些时间来创建。 现在我想随机取2个文件,将它们读入内存并创建一个封装它们的新请求。
我正在使用 C#,这一行有效:
var a = Sample.GetRootAsSample(new ByteBuffer(System.IO.File.ReadAllBytes(pathToA)));
var b = Sample.GetRootAsSample(new ByteBuffer(System.IO.File.ReadAllBytes(pathTob)));
但我似乎找不到在新的 Request 实例中引用它们的方法。 我需要一些方法将这些缓冲区按原样添加到新的构建器中,然后将它们的偏移量传递给同一个构建器中的新请求。 在新的构建器中重新构建它们效率不高。
我怎样才能做到这一点?
目前无法在 C# 中自动深度复制 table。由于 tables 可能引用缓冲区中的各种位置,这不是一个微不足道的操作,它需要专用代码生成或反射。
C++ 中有一个使用反射的 CopyTable
。这可以移植到 C# 或从 C# 调用。
另一种方法是将现有缓冲区以二进制形式包含在新 table 中,即使 a
和 b
成为 ubytes 向量。这意味着您必须调用 GetRootAs
才能访问它们,但这仍然非常有效。