Задать вопрос
@kudim

JSON сериализация c#. Возможна ли десериализация объекта, одним из полей которого является интерфейс?

Добрый день. Столкнулся с проблемой, мне нужно сохранять, а затем восстанавливать состояние объекта класса Movie.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace ConsoleApplication1
{
    class Program
    {
        interface IMan
        {
            void print();
        }

        class Actor : IMan
        {
            private string name_actor;

            public string Name_actor
            {
                get { return name_actor; }
                set { name_actor = value; }
            }

            public Actor()
            {

            }
            public Actor(string name)
            {
                this.name_actor = name;
            }
            public void print()
            {

            }
        }

        class Movie
        {
            private string name;
            private IMan man;

            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public IMan Man
            {
                get { return man; }
                set { man = value; }
            }
            public Movie()
            {

            }
            public Movie(string name, IMan m)
            {
                this.name = name;
                this.man = m;
            }
        }
        static void Main(string[] args)
        {
            string name_film = "Logan";
            string name_actor = "Hugh Michael Jackman";
            IMan actor = new Actor(name_actor);

            // сериализация

            Movie movie = new Movie(name_film, actor);
            File.WriteAllText(@"f:\movie.json", JsonConvert.SerializeObject(movie));

            // десериализация 

            Movie movie1 = JsonConvert.DeserializeObject<Movie>(File.ReadAllText(@"f:\movie.json"));
        }
    }
}

Сохранение происходит хорошо и в файл записывает:
{"Name":"Logan","Man":{"Name_actor":"Hugh Michael Jackman"}}

Десериализовать же не получается из-за того, что есть поле IMan в классе Movie. И собственно вопрос прозвучал в теме.
  • Вопрос задан
  • 798 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
dmitry_pavlov
@dmitry_pavlov
World-class .NET freelance contractor (remotely)
Надо настроить сериализацию Json.NET, чтобы она работала с объектами по реальному типу, реализующему интерфейс или реализовать с помощью конвертора. Посмотрите эту ветку
Casting interfaces for deserialization in JSON.NET
Ответ написан
Ответ написан
Комментировать
@kvasek
Посмотрите в сторону JsonConverterAttribute

должно получиться както так
class Movie {
   ....

  [JsonConverter(typeof(IManConverter))]
  public IMan Man { get; set; }
  
  ....
}


Для конкретного случая может не подойти но попробовать стоит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы