Проблема с использованием JsonConvert с интерфейсами без конкретного объекта - PullRequest
0 голосов
/ 21 января 2019

У меня возникли проблемы с десериализацией сообщения в объект undefined .Я называю это неопределенным объектом, потому что у меня нет подходящего класса, который бы напоминал данные сообщения.У меня есть только интерфейс.Поскольку проект, над которым я работаю, довольно тяжелый, я не буду отображать каждую строчку кода, кроме случаев, когда вам нужно спросить.

У меня есть интерфейс, назовем его ITest (который сам реализует другие интерфейсыи другой класс. Так что он довольно сложный)

И в моем объеме я получаю «сообщение», сериализованное с JsonConvert, точно в соответствии с шаблоном этого интерфейса ITest. Я не буду вдаваться в подробности того, как это было на самом деле сериализации, но решение не может быть использовано для аспекта десериализации .И тут возникает проблема:

Так как я должен десериализовать это сообщение в интерфейс, ну ... я, очевидно, не могу.Таким образом, я попробовал много (МНОГО) обходных путей, которые.Используя другой Nuget (например, «Impromptu Interfaces» или Castle.Core), или даже AutoMapping мой интерфейс для типа объекта (динамический), но либо код не скомпилируется, либо я получаю только половину данных, или я получаю толькосвойства со значениями null / 0.Самое близкое, что я получил, было с Экспромтом ... Я сейчас немного отчаялся.

Я бы не хотел делать этот чертов Бетонный тип.Поскольку мне нужно их много.СУХАЯ концепция истекает кровью: (

Вот Экспромт

var obj = ActLike<ITest>(message)

Вот AutoMapping

    public interface ITest
    {
        string Test { get; set; }
        int Val { get; set; }
    }

    static void Main(string[] args)
    {
        Mapper.Initialize(cfg => { });

        var a = new { Test = "test", Val = 1 };
        ITest b = Mapper.Map(a, typeof(Object), typeof(ITest)) as ITest;

    }

Где я пытался превратить эту чертову "var a" вдинамический объект Json для использования в отображении. И многое другое ...

Так что да ... Я как бы застрял прямо сейчас.

Спасибо за любую помощь, которую вы мне могли бы оказать!

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я вроде нашел решение, используя прокси-систему MassTransit, по следующим направлениям:

            JsonSerializer jsonMessageDeserializer = JsonMessageSerializer.Deserializer;

            Type type = typeof(T);
            if (type.IsInterface && TypeMetadataCache.IsValidMessageType(type))
                type = TypeMetadataCache.GetImplementationType(type);

            using (Stream body = new MemoryStream(Encoding.UTF8.GetBytes(message)))
                using (StreamReader streamReader = new StreamReader(body, Encoding.UTF8, false, 1024, true))
                    using (JsonTextReader jsonTextReader = new JsonTextReader((TextReader)streamReader)) 
                    {
                        Object objBody = jsonMessageDeserializer.Deserialize((JsonReader)jsonTextReader);
                        JsonReader r = ((JsonReader)new JTokenReader(GetMessageToken((objBody))));
                        object obj2 = jsonMessageDeserializer.Deserialize(r, type);
0 голосов
/ 22 января 2019

Возможно, мне не хватает части проблемы, но это может быть вариант.Добавление небольшой информации о типе в ваш сериализованный объект.

  static void Main(string[] args)
    {
        var objectToSerialize = new List<IFoo>() {
            new TestClass()
            {
                Test = "A",
                Test2 = "B"
            },
              new TestClass2()
            {
                Test = "C",
                Test3 = "D"
            },

        };
        // TODO: Add objects to list
        var jsonString = JsonConvert.SerializeObject(objectToSerialize, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
        var deserializedObject = JsonConvert.DeserializeObject<List<IFoo>>(jsonString, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
        var result = deserializedObject;
    }
}

internal interface IFoo
{
     string Test { get; set; }
}
public class TestClass : IFoo
{
    public string Test { get; set; }
    public string Test2 { get; set; }
}
public class TestClass2 : IFoo
{
    public string Test { get; set; }
    public string Test3 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...