.NET Sporadic Formatexception: не может десериализировать «строку» от BSONTYPE 'ObjectId'C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 .NET Sporadic Formatexception: не может десериализировать «строку» от BSONTYPE 'ObjectId'

Сообщение Anonymous »

С момента обновления до .NET 6 до .NET 8 мы получаем очень необычное и спорадическое поведение от MongoDB (драйвер?). Every couple of days (sometimes weeks) the driver would start throwing the following exception during data read:

System.FormatException: An error occurred while deserializing the Id property of class X : Cannot deserialize a 'String' from BsonType 'ObjectId'.

where X is a root class for 2 Полученные классы A & b :

Код: Выделить всё

public class X
{
// MongoDB ObjectId
public string Id { get; set; }

// Other common properties...
}

public class A : X
{
// Stuff... but without ID (it is inherited from X)
}

public class B : X
{
// Stuff... but without ID (it is inherited from X)
}

Это исключение будет продолжаться до тех пор, пока приложение не будет перезагружено, что заставляет его снова работать в течение нескольких дней.
mongodb.driver версии v3.4.0 , версия сервера v4.2.8 . 
[list]
[*]. Используется.
[*] Карты классов зарегистрированы в статическом конструкторе. 
или b запрашивается с использованием oftype в коллекции x .
[*] Вставленные документы имеют правильный дискриминатор _t: [x, a (или b)] , означающее, что это массив. Я следовал этому веб -руководству для полиморфизма в mongodb < /li>
TDocument может быть только x . Это означает, что порядок регистрации карты класса -x -> a/b -> b/a .
[*] Наша обертка Mongo -это Singleton.static MongoWrapper()
{
BsonSerializer.TryRegisterSerializer(new GuidSerializer(GuidRepresentation.CSharpLegacy));

RegisterClassMap(typeof(TDocument), "Id");

// not ideal -- I know
var derivedTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetLoadableTypes())
.Where(type => type is not null && !type.IsAbstract && type.IsSubclassOf(typeof(TDocument)));

foreach (var derivedType in derivedTypes)
{
RegisterClassMap(derivedType, "Id");
}

ConventionRegistry.Register(
"DocumentStorage.IgnoreExtraElements",
new ConventionPack() { new IgnoreExtraElementsConvention(true) },
type => true
);
ConventionRegistry.Register(
"DocumentStorage.IgnoreNull",
new ConventionPack { new IgnoreIfNullConvention(true) },
type => true
);
}

private static void RegisterClassMap(Type classType, string idPropertyName)
{
if (classType.BaseType != typeof(object) && !BsonClassMap.IsClassMapRegistered(classType.BaseType))
RegisterClassMap(classType.BaseType, idPropertyName);
else if (classType is null || classType == typeof(object))
return;

if (!BsonClassMap.IsClassMapRegistered(classType))
{
var baseMap = BsonClassMap.IsClassMapRegistered(classType.BaseType)
? BsonClassMap.LookupClassMap(classType.BaseType)
: null;

var classMap = new BsonClassMap(classType, baseMap);

classMap.AutoMap();
classMap.SetIgnoreExtraElements(true);

if (classMap.BaseClassMap?.IdMemberMap is null)
{
classMap.SetIsRootClass(true);

classMap.MapIdProperty(idPropertyName)
.SetSerializer(new StringSerializer(BsonType.ObjectId))
.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetIgnoreIfNull(false)
.SetIgnoreIfDefault(true);
}

classMap.Freeze();
BsonClassMap.RegisterClassMap(classMap);
}
}
< /code>
Ни один другой класс не манипулирует MongoDB, и только одно место регистрирует карты класса. Документы хранятся с удостоверением личности. Даже за исключением, которые происходят, документы все еще хранятся с идентификатором.var collection = database.GetCollection("XCollection").OfType();
var data = await collection.Find().ToListAsync()
< /code>
полностью потерян, < /p>

Кто -то столкнулся с той же проблемой и смог найти решение? Отсутствует? Deserialize идентификационный свойство x (хотя это работало только несколько минут ранее)
[/list]
Полное исключение:
System.FormatException: An error occurred while deserializing the Id property of class X: Cannot deserialize a 'String' from BsonType 'ObjectId'.
---> System.FormatException: Cannot deserialize a 'String' from BsonType 'ObjectId'.
at MongoDB.Bson.Serialization.Serializers.StringSerializer.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
--- End of inner exception stack trace ---
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
at MongoDB.Driver.OfTypeSerializer`2.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
at MongoDB.Driver.Core.Operations.CursorBatchDeserializationHelper.DeserializeBatch[TDocument](RawBsonArray batch, IBsonSerializer`1 documentSerializer, MessageEncoderSettings messageEncoderSettings)
at MongoDB.Driver.Core.Operations.FindOperation`1.CreateFirstCursorBatch(BsonDocument cursorDocument)
at MongoDB.Driver.Core.Operations.FindOperation`1.CreateCursor(IChannelSourceHandle channelSource, IChannelHandle channel, BsonDocument commandResult)
at MongoDB.Driver.Core.Operations.FindOperation`1.ExecuteAsync(RetryableReadContext context, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.FindOperation`1.ExecuteAsync(IReadBinding binding, CancellationToken cancellationToken)
at MongoDB.Driver.OperationExecutor.ExecuteReadOperationAsync[TResult](IReadBinding binding, IReadOperation`1 operation, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperationAsync[TResult](IClientSessionHandle session, IReadOperation`1 operation, ReadPreference readPreference, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.ToListAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)


Подробнее здесь: https://stackoverflow.com/questions/797 ... ntype-obje
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»