c# – 使用流通过Json.NET创建BSON字节数组(用于文件格式)
发布时间:2020-12-15 21:52:01 所属栏目:百科 来源:网络整理
导读:我们需要BSON相当于 { "Header": { "SubHeader1": { "Name": "Bond","License": 7 },"SubHeader2": { "IsActive": true } },"Payload": /* This will be a 40GB byte stream! */} 但我们得到的是: 如您所见,有效载荷首先出现,然后是标题的其余部分! 我们使
我们需要BSON相当于
{ "Header": { "SubHeader1": { "Name": "Bond","License": 7 },"SubHeader2": { "IsActive": true } },"Payload": /* This will be a 40GB byte stream! */ } 但我们得到的是: 如您所见,有效载荷首先出现,然后是标题的其余部分! 我们使用的是Json.NET的BSON编写器(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,dummyPayload.Length); // End bw.WriteEndObject(); } } 这看起来像没有同步/不刷新缓冲区的经典情况,尽管我们在将有效负载写入底层流之前实际发出了Flush to Json.NET. 问题:还有其他办法吗?我们宁愿不分叉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; } } 解决方法
好的,所以我们在这里达到了一些中间地带,因为我们没有时间(目前)修复其他优秀的Json.NET库.由于我们很幸运只有最后的流,我们现在使用BSON作为标题(小到足够一个byte [])然后将它传递给标准流编写器,即表示为:
{ "SubHeader1": { "Name": "Bond","License": 7 },"SubHeader2": { "IsActive": true } } /* End of valid BSON */ // <= Our Stream is written here,raw byte stream,no BSON 拥有统一的BSON布局会更美观,但如果没有它,这也很有效.可能也快一点!如果有人在将来仍能找到更好的答案,我们正在倾听. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |