我们需要BSON 等价于
{
"Header": {
"SubHeader1": {
"Name": "Bond",
"License": 7
},
"SubHeader2": {
"IsActive": true
}
},
"Payload": /* This will be a 40GB byte stream! */
}
但我们得到的是:
如您所见,有效载荷首先出现,然后是标题的其余部分!
我们正在使用 Json.NET 的 BSON writer ( Bson.BsonWriter.WriteValue(byte[] value)
),但它只接受实际byte[]
的Stream
. 由于我们的有效负载将是 10 GB,我们必须使用流,所以我们尝试解决(下面的代码),但这给了我们上面显示的错误结果
public void Expt()
{
// Just some structure classes, defined below
var fileStruct = new FileStructure();
using (Stream outputSt = new FileStream("TestBinary.bson", FileMode.Create))
{
var serializer = new JsonSerializer();
var bw = new BsonWriter(outputSt);
// Start
bw.WriteStartObject();
// Write header
bw.WritePropertyName("Header");
serializer.Serialize(bw, fileStruct.Header);
// Write payload
bw.WritePropertyName("Payload");
bw.Flush(); // <== flush !
// In reality we 40GB into the stream, dummy example for now
byte[] dummyPayload = Encoding.UTF8.GetBytes("This will be a 40GB byte stream!");
outputSt.Write(dummyPayload, 0, dummyPayload.Length);
// End
bw.WriteEndObject();
}
}
尽管我们在将有效负载写入底层流之前实际上向 Json.NET 发出了 Flush,但这看起来像是没有同步/不刷新缓冲区的经典案例。
问题:还有其他方法可以做到这一点吗?我们宁愿不分叉 Json.NET 的源代码(并探索它的内部管道)或以某种方式重新发明轮子......
详细信息:支持结构类是(如果你想重现这个)
public class FileStructure
{
public TopHeader Header { get; set; }
public byte[] Payload { get; set; }
public FileStructure()
{
Header = new TopHeader
{
SubHeader1 = new SubHeader1 {Name = "Bond", License = 007},
SubHeader2 = new SubHeader2 {IsActive = true}
};
}
}
public class TopHeader
{
public SubHeader1 SubHeader1 { get; set; }
public SubHeader2 SubHeader2 { get; set; }
}
public class SubHeader1
{
public string Name { get; set; }
public int License { get; set; }
}
public class SubHeader2
{
public bool IsActive { get; set; }
}