Вы, похоже, используете ASMX (не WCF), потому что вы пропустили атрибуты [DataMember]
во всех ваших общедоступных свойствах и все еще сериализуетесь. WCF "opt-in", поэтому вы не должны видеть какой-либо сериализации должным образом.
В результате все атрибуты [DataContract]
бесполезны.
ASMX по умолчанию использует JavaScriptSerializer, если вы используете ScriptManger и выводите JSON. JavaScriptSerializer отключен (это означает, что все открытые свойства автоматически сериализуются, если они не помечены [ScriptIgnoreAttribute]
).
JavaScriptSerializer поддерживает сериализацию List <>. У вас не должно возникнуть проблем с сериализацией вашего свойства TestCol, потому что JavaScriptSerializer автоматически поддерживает сериализацию всех типов, которые реализуют IEnumerable (но не IDictionary) - который включает List <> - в массивы JSON.
Кажется, ваша ошибка в том, что JavaScriptSerializer неправильно обрабатывает классы, которые наследуют из List <> (или от класса, реализующего IEnumerable). В своем первом обходном пути вы исключили класс, унаследованный от List <>. Во второй работе вы пропустили все функции базового класса, но повторно реализовали List <> в свойстве.
Ваши данные в формате JSON в настоящее время выглядят так:
{ Components: [
{ Name:"foo" },
{ Name:"bar" },
:
] }
Однако у вас есть один дополнительный уровень или перенаправление в сериализаторе (наследование от List<Test>
-> TestCol
). Возможно, что сериализатор ищет:
{ Components: {
Items: [
{ Name:"foo" },
{ Name:"bar" },
:
] }
}
потому что вы по существу сериализуете свойство "Items" List <>. Итак, ваши данные постов JSON просто передают объекты Test в неправильное место, а свойство TestCol Components оказывается пустым.
Я бы предложил добавить метод веб-службы для вывода тестового объекта MainTest, чтобы увидеть, во что он сериализуется. Вы, вероятно, обнаружите, что это добавляет дополнительный уровень.