如果存在,从BSON中读取字段

问题描述 投票:0回答:1

我的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标记,它会抛出一个异常,如果这个方法会涉及到读取很多对象,可能会导致很多异常,这将打击我的应用程序的性能。

c# mongodb mongodb-.net-driver
1个回答
0
投票

据我所知,在我的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;
        }

注意: 我没有验证整个逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.