none
Скрытие свойства базового класса вместе с его аттрибутом RRS feed

  • Вопрос

  • Допустим, есть базовый класс и его наследник:

    public class Class1
    {
        [DataMember(Name = "Свойство")]
        public String Svoystvo { get; set; }
    }
        public class Class11 : Class1
    {
        [DataMember(Name = "Свойство")]
        public new String Svoystvo { get; set; }
    }

    Каждый из этих классов в дальнейшем сериализуется в json-строку для отправки запроса на сервер. Но когда от сервера приходит ответ, и, когда он сериализуется из json-строки обратно в класс, вылетает ошибка "The dictionary cannot be deserialized because the member 'Свойство' was found more than once in the input." То есть, несмотря на то, что Svoystvo класса-наследника скрывает Svoystvo базового класса, сериализатор всё равно видит, что аттрибут "Свойство" задаётся дважды в классе-наследнике.

    Как, не удаляя Svoystvo и его аттрибут из базового класса, скрыть его вместе с аттрибутом в классе-наследнике? Не хотелось бы удалять его в базовом классе и прописывать только в дочерних.

    upd 20.04.2015

    Я немного изменю свой первоначальный пример, ибо он-то как раз решается просто, а проблема непосредственно моего проекта - выглядит немного иначе. Вот примерно такие класс и подкласс у меня:

    public class Class1
    {
        [DataMember(Name = "Атрибут")]
        public ClassSvoystvo ClassSvoystvo1 { get; set; }
    
        [DataContract]
        public class ClassSvoystvo
        {
    
        }  
    }
    
    public class PodClass : Class1
    {
        [DataMember(Name = "Атрибут")]
        public new ClassSvoystvo[] ClassSvoystvo1 { get; set; }
    
        [DataContract]
        public new class ClassSvoystvo
        {
    
        }
    }

    То есть, в одном случае объект, в другом - массив объектов того же типа, но в итоге получается - это свойства разных типов. При таком раскладе сериализатор, десериализующий json-строку в PodClass, видит, что атрибут "Атрибут" в классе задваивается, в результате чего приложение сваливается с исключением, описанным выше.


    19 апреля 2015 г. 18:02

Ответы

  • Возможно надо бы посмотреть. Но я советую вам для JSON использовать более мощную библиотеку, JSON NET, у него возможностей намного больше.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Eugene Razmanov 20 апреля 2015 г. 16:54
    20 апреля 2015 г. 6:17
    Модератор
  • Да. Переход на JSON.NET решил проблему. Этот сериализатор не на какие "задваивания" не ругается.
    • Помечено в качестве ответа Eugene Razmanov 20 апреля 2015 г. 16:54
    20 апреля 2015 г. 16:54

Все ответы

  • Насколько понял у вас нет доступа к базовому классу?

    Сделаем содержимое сообщества лучше, вместе!

    19 апреля 2015 г. 20:27
    Модератор
  • Насколько понял у вас нет доступа к базовому классу?

    Есть.

    Просто в одном случае параметр в json-ответе может быть в виде класса (тогда сериализация json-строки идёт в базовый класс или в классы-наследники, где класс-свойство не скрывается таким же свойством в подклассе), а в другом - в виде массива из этих же классов (сериализация идёт в подкласс, где класс-свойство базового класса заменяется массивом из этих классов).

    20 апреля 2015 г. 3:12
  • Гугление по интернету вроде как намекает на то, что надо как-то использовать Attribute Usage и его флаги Inherited и AllowMultiple, но поскольку я в C# в общем-то ещё новичок, то не могу понять, как это синтаксически реализовать в моём примере.
    20 апреля 2015 г. 5:37
  • Да есть такое, но это не ваш случай. Они задаются когда атрибуты создаёте вы и сериализатор тоже. А тут вы уже используете готовый. А какой сериализатор вы используете? Может в нём есть какие настройки процесса сериализации.

    Сделаем содержимое сообщества лучше, вместе!

    20 апреля 2015 г. 6:05
    Модератор
  • DataContractJsonSerializer
    20 апреля 2015 г. 6:09
  • Хммм.. Может, написать свой атрибут, унаследовать его от DataMemberAttribute и там задать AttributeUsage? А потом просто применять этот атрибут вместо DataMember
    20 апреля 2015 г. 6:11
  • Возможно надо бы посмотреть. Но я советую вам для JSON использовать более мощную библиотеку, JSON NET, у него возможностей намного больше.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Eugene Razmanov 20 апреля 2015 г. 16:54
    20 апреля 2015 г. 6:17
    Модератор
  • Но я советую вам для JSON использовать более мощную библиотеку, JSON NET, у него возможностей намного больше.


    Нееее, я тогда надолго увязну в решении проблемы :)

    А тем временем, DataMemberAttribude не наследуется :(

    20 апреля 2015 г. 6:23
  • Вот для конкретно того примера, который приведён в заглавном сообщении, можно было бы вместо "new" прописать "override". Но в моём проекте не строки, а классы: в базовом - свойство-класс, в наследнике - свойство-массив классов, то есть свойства разного типа.

    Блин, такая мелкая проблема приводит к написанию кучи ненужных дублей кода :(

    20 апреля 2015 г. 7:19
  • Да. Переход на JSON.NET решил проблему. Этот сериализатор не на какие "задваивания" не ругается.
    • Помечено в качестве ответа Eugene Razmanov 20 апреля 2015 г. 16:54
    20 апреля 2015 г. 16:54