Могу ли я сделать JSON.NET DESERIALIZE тип записи C# 9 с «первичным» конструктором, как если бы он имел [JSONConstructorC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Могу ли я сделать JSON.NET DESERIALIZE тип записи C# 9 с «первичным» конструктором, как если бы он имел [JSONConstructor

Сообщение Anonymous »

Использование C# 9 на .net 5.0, у меня есть куча типов записей, например: < /p>

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

public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened)
{
public SomethingHappenedEvent(object theThing, string whatHappened)
: this(Guid.NewGuid(), theThing, whatHappened)
{ }
}
< /code>
Как и следовало ожидать, они сериализуются и отправляются в другом месте для обработки. Отправители звонят в конструктор с двумя аргументами и получают новый идентификатор, но Deserializer должен использовать «первичный» конструктор 3-аргумента, подразумеваемый записным объявлением.
Я использую Newtonsoft json.net, и я уверен, что это сработало: < /p>
        var record = new SomethingHappenedEvent("roof", "caught fire");
var json = JsonConvert.SerializeObject(record);
var otherSideRecord = JsonConvert.DeserializeObject(json);
Assert.AreEqual(record, otherSideRecord);
< /code>
Конечно, это не так. Это бросает JsonerializationException. Он не может найти правильный конструктор, потому что их два, а также конструктор по умолчанию по умолчанию, и не отмечен JSONConstructOratrattribute.
Мой вопрос действительно: «Какие варианты у меня есть для получения чего-то подобного?». Это было бы здорово: < /p>
[JsonConstructor]
public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened)
{
public SomethingHappenedEvent(object theThing, string whatHappened)
: this(Guid.NewGuid(), theThing, whatHappened)
{ }
}
< /code>
Но это пытается применить атрибут к типу, который является недействительным.
, и это синтаксическая ошибка в C#, хотя, очевидно, работает в F#. < /p>
public record SomethingHappenedEvent
[JsonConstructor]
(Guid Id, object TheThing, string WhatHappened)
{
public SomethingHappenedEvent(object theThing, string whatHappened)
: this(Guid.NewGuid(), theThing, whatHappened)
{ }
}
< /code>
Мое текущее решение состоит в том, чтобы оставить эти типы в качестве простых классов и жить со всеми дополнительными шаблонами. Я также знаю, что могу опустить пользовательский конструктор и заставить моих абонентов генерировать идентификаторы. Это работает, потому что есть только один конструктор для json.net, чтобы найти. Это конечно Но я не люблю повторять код на всех сайтах вызовов, даже если он маленький в этом случае. < /P>
public record SomethingHappenedEvent(Guid Id, object TheThing, string WhatHappened) { }
fwiw это звучит как system.text.json имеет одинаковое ограничение.

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

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

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

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

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

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

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