C# 序列化IList<;Guid>;将MongoDB作为BsonString而不是LUUID

C# 序列化IList<;Guid>;将MongoDB作为BsonString而不是LUUID,c#,.net,mongodb,asp.net-core,.net-core,C#,.net,Mongodb,Asp.net Core,.net Core,我对MongoDb中存储的GUID列表有问题。我希望将它们存储为字符串,而不是LUUID条目 目前,我正在使用BsonRepresentation(BsonType.String)属性表示法,但我想用初始化代码替换它,这样我就可以将所有内容保存在一个地方 using System; using System.Collections.Generic; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespac

我对MongoDb中存储的GUID列表有问题。我希望将它们存储为字符串,而不是LUUID条目

目前,我正在使用BsonRepresentation(BsonType.String)属性表示法,但我想用初始化代码替换它,这样我就可以将所有内容保存在一个地方

using System;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace Program.Dto
{
    public class Node
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public IList<Node> Groups { get; set; }
        [BsonRepresentation(BsonType.String)]
        public IList<Guid> Classes { get; set; }
        public static Node Create(string name)
        {
            return new Node
            {
                Id = Guid.NewGuid(),
                Name = name,
                Groups = new List<Node>(),
                Classes = new List<Guid>()
            };
        }
    }
}
因此,我可能需要一个自定义序列化程序,并附带了如下内容:

using System;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;

namespace Program.MongoDB.BsonSerializers
{
    public sealed class GuidListSerializer : BsonSerializerBase<IList<Guid>>
    {
        public override IList<Guid> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
        {
            var guids = new List<Guid>();

            var bsonReader = context.Reader;
            bsonReader.ReadStartDocument();
            bsonReader.ReadString();
            bsonReader.ReadStartArray();

            while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
            {
                var guid = new Guid(bsonReader.ReadBinaryData().Bytes);
                guids.Add(guid);
                bsonReader.ReadEndArray();
            }

            bsonReader.ReadEndDocument();

            return guids.AsReadOnly();
        }

//Override the serialize method for storing guids as strings?

    }
}
我希望能够将guid存储为字符串,而不使用属性

[BsonRepresentation(BsonType.String)]

您应该检查读卡器的状态,并且只有在状态合适时才读取数组末尾:

while (bsonReader.State != BsonReaderState.EndOfArray)
{
    var guid = new Guid(bsonReader.ReadBinaryData().Bytes);
    guids.Add(guid);
}

bsonReader.ReadEndArray();

ReadEndArray()不应该在循环之外吗?如果列表长度超过1项,您的ReadEndArray中可能会出现异常,因为您在每个Guid项之后调用它。感谢您的回复。同时,我放弃了整个过程,不再将guid存储为字符串。然而,我在这里找到了一个关于BsonReader如何工作的快速解释(我知道它是Java的,但我猜它在.net中的工作方式是相同的):
System.InvalidOperationException: 'ReadEndArray can only be called when State is EndOfArray, not when State is Value.'
[BsonRepresentation(BsonType.String)]
while (bsonReader.State != BsonReaderState.EndOfArray)
{
    var guid = new Guid(bsonReader.ReadBinaryData().Bytes);
    guids.Add(guid);
}

bsonReader.ReadEndArray();