gpt4 book ai didi

c# - mongodb C#异常无法从BsonType Int32反序列化字符串

转载 作者:IT老高 更新时间:2023-10-28 13:14:41 25 4
gpt4 key购买 nike

我是 C# 中使用 mongo db 的新手,但我正在尝试在 mongo db 中导入大型数据库。MyDb 由仅具有简单参数 Id 、 Body 、 Title Tags 的实体组成。

这是 mongo 中的实体示例。

{
"Id" : "someff asdsa",
"Title" : "fsfds fds",
"Body ": "fsdfsd fs",
"Tags" : "fsdfdsfsd"
}

这是我在 C# 中的 mongoEntity 类

 [BsonIgnoreExtraElements]
class Element
{
[BsonId]
public ObjectId _id { get; set; }
[BsonElement("Id")]
public string Id { get; set; }
[BsonElement("Title")]
public string Title { get; set; }
[BsonElement("Body")]
public string Body { get; set; }
[BsonElement("Tags")]
public string Tags { get; set; }

public void ShowOnConsole()
{
Console.WriteLine(" _id {0} Id {1} Title {2} Body {3} Tags {4} ", _id, Id, Title, Body, Tags);
}

}

这是我在 Main 方法中的代码

  const string connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);

MongoServer server = client.GetServer();
MongoDatabase database = server.GetDatabase("mydb");


MongoCollection<Element> collection = database.GetCollection<Element>("train");
Console.WriteLine("Zaimportowano {0} rekordow ", collection.Count());

MongoCursor<Element> ids = collection.FindAll();

foreach (Element entity in ids)
{
entity.ShowOnConsole();
}

当我运行这段代码时,我可以看到一些数据,但我遇到了异常“无法从 BsonType Int32 反序列化字符串。”我认为其中一个属性在数据库中表示为 int ,但我不知道如何处理它?为什么一个实体中的一个属性是 int 而另一个对象中的相同属性是 string ?我必须做什么才能读取所有数据库?

最佳答案

是的,C# 对象中的 String 属性在 mongo 存储中具有 Int32 值,因此在序列化过程中出现异常(参见 MongoDB.Bson.Serialization.Serializers.BsonStringSerializer 类的代码)。

1) 您可以定义自己的序列化程序,它将 Int32 值反序列化为字符串属性以及 String 值。这里是:

public sealed class StringOrInt32Serializer : BsonBaseSerializer
{
public override object Deserialize(BsonReader bsonReader, Type nominalType,
Type actualType, IBsonSerializationOptions options)
{
var bsonType = bsonReader.CurrentBsonType;
switch (bsonType)
{
case BsonType.Null:
bsonReader.ReadNull();
return null;
case BsonType.String:
return bsonReader.ReadString();
case BsonType.Int32:
return bsonReader.ReadInt32().ToString(CultureInfo.InvariantCulture);
default:
var message = string.Format("Cannot deserialize BsonString or BsonInt32 from BsonType {0}.", bsonType);
throw new BsonSerializationException(message);
}
}

public override void Serialize(BsonWriter bsonWriter, Type nominalType,
object value, IBsonSerializationOptions options)
{
if (value != null)
{
bsonWriter.WriteString(value.ToString());
}
else
{
bsonWriter.WriteNull();
}
}
}

然后用这个序列化器标记必要的属性(你认为在 MongoDB 中有不同的类型),例如:

[BsonElement("Body")]
[BsonSerializer(typeof(StringOrInt32Serializer))]
public string Body { get; set; }

我也在这里找到了非常相似的问题:Deserializing field when type is changed using MongoDb csharp driver


2) 第二种方法 - '规范化' 存储中的数据:将所有整数字段值转换为字符串。因此,您应该将字段 $type 从 16(32 位整数)更改为 2(字符串)。见 BSON types .让我们为 body 字段:

db.train.find({ 'body' : { $type : 16 } }).forEach(function (element) {   
element.body = "" + element.body; // Convert field to string
db.train.save(element);
});

关于c# - mongodb C#异常无法从BsonType Int32反序列化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com