我的BSON文档中有些会包含某个字段,有些则不会。我想在我的BSON反序列化方法中创建某种条件逻辑,这样我就可以在存在这种字段时采取行动。下面是我用于反序列化的coode。
public class AbstractStateSerializer : SerializerBase<AbstractState>, IBsonDocumentSerializer
{
public override AbstractState Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
context.Reader.ReadStartDocument();
context.Reader.ReadBsonType();
context.Reader.SkipName();
var representation = context.Reader.ReadInt32();
// the below if statement and its body won't work, but this snippet illustrates my goal
if (context.Reader.HasName("PreviousState")) {
var prevState = context.Reader.ReadInt32();
// do something with prevState
}
context.Reader.ReadEndDocument();
var result = new AbstractState();
// AbstractState object initialization, etc.
return result;
}
// ...other methods required by the interface
}
我怎样才能实现类似于下面的代码?if (context.Reader.HasName("PreviousState"))
? 我想避免只是盲目地尝试读取name,因为我假设如果没有name标记,它会抛出一个异常,如果这个方法会涉及到读取很多对象,可能会导致很多异常,这将打击我的应用程序的性能。
据我所知,在我的BSON反序列化方法中,并不存在一个关于 HasName
因为你总是需要一个一个地读字节。可以考虑这个变通方法。
public override AbstractState Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
context.Reader.ReadStartDocument();
context.Reader.ReadBsonType();
context.Reader.SkipName();
var representation = context.Reader.ReadInt32();
var bookmark = context.Reader.GetBookmark();
var name = context.Reader.ReadName(Utf8NameDecoder.Instance);
// the below if statement and its body won't work, but this snippet illustrates my goal
if (name == "PreviousState")
{
var prevState = context.Reader.ReadInt32();
// do something with prevState
}
else
{
context.Reader.ReturnToBookmark(bookmark);
}
context.Reader.ReadEndDocument();
var result = new AbstractState();
// AbstractState object initialization, etc.
return result;
}
注意: 我没有验证整个逻辑。