C# 序列化IList<;Guid>;将MongoDB作为BsonString而不是LUUID
我对MongoDb中存储的GUID列表有问题。我希望将它们存储为字符串,而不是LUUID条目 目前,我正在使用BsonRepresentation(BsonType.String)属性表示法,但我想用初始化代码替换它,这样我就可以将所有内容保存在一个地方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
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();