Разработка классов с интерфейсом в C # (JSON.NET) - PullRequest
0 голосов
/ 21 марта 2011

Я нахожусь в процессе разработки системы детализации для игры. Я создаю набор интерфейсов (IItem, IConsumable, IEquipable, IWeapon и т. Д.), Чтобы определить, какой тип функциональности возможен с элементами, а затем ряд классов (Оружие, Зелье и т. Д.) Определить фактические типы элементов.

Теперь при сохранении проигрывателя данные будут сохраняться в виде файла JSON (с использованием библиотеки JSON.NET) и будут включать в себя инвентарь проигрывателя, в который будут включены эти элементы. Проблема заключается в том, что, когда я пытаюсь десериализовать файл JSON в объект при чтении в файле, как я могу сказать библиотеке JSON.NET, какой это класс?

Одна вещь, о которой я подумал и еще не успел попробовать, - это то, что все мои объекты, которые сериализуются в JSON, имеют версию объекта DTO, которая используется вместе с библиотекой JSON.NET. Что я пытаюсь сделать, так это то, что, возможно, я мог бы добавить свойство в DTO с именем ClassType, а затем при чтении файла в приложение я сначала считал бы объект как анонимный тип. Затем, основываясь на свойстве ClassType, я бы преобразовал его в правильный тип. Вот две проблемы, с которыми я сталкиваюсь: 1. кажется, что это очень уродливое решение, и 2. я даже не уверен, возможно ли это.

Ответы [ 2 ]

1 голос
/ 30 августа 2012

(скопировано с этот вопрос )

В тех случаях, когда я не управлял входящим JSON (и поэтому не могу гарантировать, что он включает в себя свойство $ type), я написал собственный конвертер, который просто позволяет явно указать конкретный тип:

public class Model
{
    [JsonConverter(typeof(ConcreteTypeConverter<Something>))]
    public ISomething TheThing { get; set; }
}

Это просто использует реализацию сериализатора по умолчанию из Json.Net при явном указании конкретного типа.

Исходный код и обзор доступны в этом блоге .

0 голосов
/ 21 марта 2011

Вы должны знать конкретный тип при сериализации. Таким образом, вы можете использовать TypeNameHandling из JSON.NET.

http://james.newtonking.com/archive/2010/08/13/json-net-3-5-release-8-3-5-final.aspx?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+jamesnewtonking+%28James+Newton-King%29

...