System.Text.Json случайно не удается сериализовать и десериализовать, если генератор исходного кода активен.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 System.Text.Json случайно не удается сериализовать и десериализовать, если генератор исходного кода активен.

Сообщение Гость »

Здравствуйте, я работаю над игрой с базой данных сложных вложенных объектов.
Мы используем фреймворк FNA (C#), без Unity.
Мы пытаемся перейти от NewtonSoft в System.Text.Json, поскольку игра будет работать в собственной среде AOT.
System.Text.Json «случайным образом» не удается сериализовать/десериализовать все свойства объекта, некоторые из которых правильно, некоторые - нет, когда мы активируем генератор исходного кода.
Когда генератор исходного кода отключен, он сериализуется/десериализуется правильно (но не работает в AOT).Это наш вариант сериализации в Newton (всегда работает даже медленно в Native AOT)

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

       public static JsonSerializerSettings settings  = new JsonSerializerSettings
{
Formatting = Newtonsoft.Json.Formatting.None,
TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto,
DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.IgnoreAndPopulate,
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace,

Error = (sender, args) =>
{
args.ErrorContext.Handled = true;
Console.WriteLine("JsonDeserialize Error: ***" + args.ErrorContext.Error.Message);

}

};
Есть варианты сериализации для system.Text.Json.

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

public static JsonSerializerOptions jbinSerializerOption = new JsonSerializerOptions
{

WriteIndented = false, // Keep this as false to reduce JSON size.
PropertyNameCaseInsensitive = false,
DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingDefault, // Ignore default values to reduce JSON size.
IncludeFields = true,
ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles,
TypeInfoResolver = Core_JsonContext.Default, //When we mask this, source code is disabled

};
и есть класс генератора исходного кода.

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

 [JsonSourceGenerationOptions(  //wouafo ::: Source Generator parameter here
WriteIndented = false,
PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase,
GenerationMode = JsonSourceGenerationMode.Default,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
IncludeFields = true
)]

[JsonSerializable(typeof(Data_Zone))]
[JsonSerializable(typeof(Data_PageCredit))]
[JsonSerializable(typeof(AstralDBSystemLoader))]
[JsonSerializable(typeof(AstralDataBaseLoader))]
[JsonSerializable(typeof(Microsoft.Xna.Framework.Color))]
[JsonSerializable(typeof(Microsoft.Xna.Framework.Rectangle))]
[JsonSerializable(typeof(Microsoft.Xna.Framework.Vector2))]
[JsonSerializable(typeof(Microsoft.Xna.Framework.Vector3))]
[JsonSerializable(typeof(Microsoft.Xna.Framework.Vector4))]
[JsonSerializable(typeof(CoreBD.Core_Bitmap))]
[JsonSerializable(typeof(CoreBD.Core_Sprite))]
[JsonSerializable(typeof(CoreBD.Core_Sequence))]
[JsonSerializable(typeof(CoreBD.Core_Clip))]
[JsonSerializable(typeof(CoreBD.Core_ClipEtatMouv))]
[JsonSerializable(typeof(CoreBD.Core_ClipImgCle))]
[JsonSerializable(typeof(CoreBD.Core_ClipRoute))]
[JsonSerializable(typeof(CoreBD.Core_ClipImgCleAction))]
[JsonSerializable(typeof(CoreBD.Core_IANeurone))]
[JsonSerializable(typeof(CoreBD.Data_Zone))]
[JsonSerializable(typeof(CoreBD.Core_ParamZone))]

public  partial class Core_JsonContext : JsonSerializerContext //wouafo ::: Source Generator est ici
{

}
Вы видите что-то, что мы сделали плохо?
когда мы пытаемся использовать простое клонирование, например

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

 string copieText = System.Text.Json.JsonSerializer.Serialize(source, jbinSerializerOptionTriche);
return System.Text.Json.JsonSerializer.Deserialize(copieText, jbinSerializerOption);
с помощью генератора исходного кода мы получаем нулевой объект или неполный объект.
Странно то, что если мы сериализуем нашу базу данных в файл без источника код, мы можем получить его обратно с исходным кодом. Но нам нужно клонировать во время выполнения, здесь это не работает.

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

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

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

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

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

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

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