Обработка изменений пространства имен с помощью TypeNameHandling.All - PullRequest
12 голосов
/ 28 марта 2012

Мне удалось исправить себя с помощью JSON.net TypeNameHandling.Я сохраняю объект в формате JSON, используя RavenDB, и для параметра TypeNameHandling сериализатора JSON.net установлено значение true, чтобы иметь дело со структурой наследования, которая у меня есть.

Мне нужно было изменить пространство имен документа, котороеЯ храню, поэтому теперь, когда он десериализуется, он выдает ошибку «Ошибка разрешения типа, указанного в JSON», поскольку ссылка на тип в документе JSON больше не существует.

Возможно ли перехватить Jsonдесериализация для того, чтобы сделать какую-то скользящую миграцию?

Спасибо,

Ответы [ 2 ]

21 голосов
/ 29 марта 2012

Хорошо, разобрался. В конце концов, это было довольно просто. Вам необходимо переопределить DefaultSerializationBinder, который отвечает за создание типа .Net из документа. Поскольку в моем документе json содержится старое пространство имен, мне нужно было перехватить создание этого типа, чтобы вернуть правильный тип. Я собрал простую реализацию, которая позволит вам настраивать «миграции» при создании сериализатора JSON.

    public class NamespaceMigrationSerializationBinder : DefaultSerializationBinder
    {
        private readonly INamespaceMigration[] _migrations;

        public NamespaceMigrationSerializationBinder(params INamespaceMigration[] migrations)
        {
            _migrations = migrations;
        }

        public override Type BindToType(string assemblyName, string typeName)
        {
            var migration = _migrations.SingleOrDefault(p => p.FromAssembly == assemblyName && p.FromType == typeName);
            if(migration != null)
            {
                return migration.ToType;
            }
            return base.BindToType(assemblyName, typeName);
        }
    }

Где интерфейс

public interface INamespaceMigration
{
    string FromAssembly { get; }

    string FromType { get; }

    Type ToType { get; }
}
0 голосов
/ 28 марта 2012

Вы можете использовать DocumentConversionListener для этого. Пожалуйста, посмотрите здесь: http://ayende.com/blog/66563/ravendb-migrations-rolling-updates

...