基本上,我有一个数据集,文档可以包含可变长度的数组。我正在编写一个编解码器,所以我只有BsonReader
。问题是readStartArray()
返回void
而不是返回例如元素的数量。另外,我没有看到任何方法可以测试到达数组末尾的方法(除了尝试readEndArray()
并捕获异常之外)。
有什么想法吗?
答案 0 :(得分:2)
我发现也缺少用于自定义序列化的文档,但是您只需要使用Reader.State属性即可。一旦确定了数组的开始,就需要遍历每个元素,直到state == BsonReaderState.EndOfArray。您需要确保仅在状态为“类型”时才调用ReadBsonType。
以下示例反序列化一系列文档:
context.Reader.ReadStartArray();
bool ctn = true;
do
{
//If in "type" state we can call ReadBsonType. The order is important.
if (context.Reader.State == BsonReaderState.Type)
{
context.Reader.ReadBsonType();
}
//Now that we're in a value state we can read the value safely
if (context.Reader.State == BsonReaderState.Value)
{
if (context.Reader.CurrentBsonType == BsonType.Document)
{
//Handle the document here. In this case pass I it to a private method
DeserializeChild(context, args, node);
}
//state will now be "type", so continue do loop and recheck type
continue;
}
if ( BsonReaderState.EndOfArray == BsonReaderState.EndOfArray)
{
context.Reader.ReadEndArray();
ctn = false;
}
} while (ctn);
答案 1 :(得分:-1)
啊,是这样的:
while (reader.readBsonType() == BsonType.DOCUMENT) {
reader.readStartDocument();
// ...
reader.readEndDocument();
}
(在这种情况下,它是一个文档数组,我对BSON还是陌生的,所以我不知道它对值数组的工作方式。)