Проблемы управления версиями пространства имен Orleans IPersistentState POCOC#

Место общения программистов C#
Ответить
Anonymous
 Проблемы управления версиями пространства имен Orleans IPersistentState POCO

Сообщение Anonymous »

Я использую
, чтобы создать сериализатор для довольно простой записи:

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

 namespace BaseNamespace.OldNameSpace;
[GenerateSerializer, Alias("MyRecord")]
public sealed record MyRecord
{
[Id(0)]
public string Name{ get; set; }
[Id(1)]
public int Age { get; set; }
}
У меня есть зерно со следующим конструктором:

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

public sealed class MyRecordGrain([PersistentState(stateName: "MyRecordValue", MyRecordStorageKey")] IPersistentState state) : IGrain, IMyRecordGrain
Мне удается сохранить объект и получить его через конструктор каждый раз, когда я вызываю Grain. А в SQL Server это выглядит в столбце PayloadBinary с использованием select cast(PayloadBinary as varchar(MAX)), * from OrleansStorage:

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

{
"$id": "1",
"$type": "BaseNamespace.OldNameSpace.MyRecord, MyProject.Common.Model",
"Name": "Anthony",
"Age ": 14,
},
Проблема возникает, когда я тщательно реорганизую библиотеки классов и пространства имен. Если я изменю пространство имен MyRecord с пространства имен BaseNamespace.OldNameSpace; на пространство имен BaseNamespace.NewNameSpace; и вызову зернистость, сериализация хранилища завершится с этой ошибкой, поскольку пространства имен не т соответствует:

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

    Error from storage provider AdoNetGrainStorage.personCache during ReadStateAsync for grain personCache/PersonCacheKey

Exc level 0: Newtonsoft.Json.JsonSerializationException: Error resolving type specified in JSON 'BaseNamespace.OldNameSpace.MyRecord,  MyProject.Common.Model], System.Collections.Concurrent'. Path '$type', line 1, position 263.
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolveTypeName(JsonReader reader, Type& objectType, JsonContract& contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, String qualifiedTypeName)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadMetadataProperties(JsonReader reader, Type& objectType, JsonContract& contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue, Object& newValue, String& id)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
Если я верну пространство имен на BaseNamespace.OldNameSpace, все будет работать нормально. Я знаю, что мне следует добавить псевдоним к классам записей, чтобы они поддерживали разные версии, но как мне избежать этой ошибки рефакторинга пространства имен? Почему сериализованные данные должны хранить информацию о сборке и пространстве имен, если я уже предоставляю эту информацию в конструкторе зерна?

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

IPersistentState
?
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/787 ... g-problems
Ответить

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

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

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

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

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