gpt4 book ai didi

c# - 使用流通过 Json.NET 创建 BSON 字节数组(文件格式)

转载 作者:行者123 更新时间:2023-11-30 12:47:23 25 4
gpt4 key购买 nike

我们需要 BSON 等效

{
"Header": {
"SubHeader1": {
"Name": "Bond",
"License": 7
},
"SubHeader2": {
"IsActive": true
}
},
"Payload": /* This will be a 40GB byte stream! */
}

但是我们得到的是:

enter image description here

如您所见,有效负载首先出现,然后是 header 的其余部分!

我们正在使用 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; }
}

最佳答案

好的,所以我们在这里达到了一些中间立场,因为我们没有时间(目前)修复其他很棒的 Json.NET 库。由于我们很幸运只有在最后才有 Stream,我们现在使用 BSON 作为 header (对于 byte[] 来说足够小),然后将它传递给标准流编写器,即表示是:

{
"SubHeader1": {
"Name": "Bond",
"License": 7
},
"SubHeader2": {
"IsActive": true
}
} /* End of valid BSON */
// <= Our Stream is written here, raw byte stream, no BSON

如果有一个统一的 BSON 布局会更美观,但如果没有它,这也很好用。大概也快一点吧!如果将来有人仍然找到更好的答案,我们会倾听。

关于c# - 使用流通过 Json.NET 创建 BSON 字节数组(文件格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com