У меня есть приложение, в котором мне нужно использовать сериализатор контракта данных для разных, но похожих типов:
- Общие списки
- Общие коллекции
- Массивы
По запросу от Scrobi, вот полный пример модели:
[DataContract]
public class Model
{
public Model()
{
List = new List<int>(new[] {1, 2, 3});
Collection = new Collection<int>(new[] {4, 5, 6});
Array = new[] {7, 8, 9};
}
[DataMember]
public object List { get; set; }
[DataMember]
public object Collection { get; set; }
[DataMember]
public object Array { get; set; }
public string SerializeMe()
{
var serializer = new DataContractSerializer(typeof(Model), GetKnownTypes());
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, this); // exception
return Encoding.UTF8.GetString(stream.GetBuffer());
}
}
public static Type[] GetKnownTypes()
{
return new[]
{
typeof(List<int>),
typeof(Collection<int>), // error
typeof(int[]) // error
};
}
}
Проблема в том, что я не могу добавить общий список, коллекцию и массив одновременно, потому что все они используют один и тот же контракт данных.
Когда я использую только один из типов коллекций, я не могу сериализовать остальные, потому что они неизвестны (контракт данных присутствует, но для другого типа). И да, поля должны быть объектами, чтобы это работало в моем случае (и в реальном приложении я не могу добавлять к ним атрибуты).
В приложении, которое я пишу, очень непрактично использовать только один из типов, поскольку это своего рода среда разработки, и разработчик может свободно выбирать тип.
Есть ли способ обойти это ограничение сериализатора контрактов данных?
Спасибо,
Collection<int>
к известным типам? Если все коллекции уже эквивалентны и взаимозаменяемы? - person Scrobi   schedule 03.07.2017XmlSerializer
: XmlInclude: список и массив. Вероятно, подобное решение сработает и здесь. - person dbc   schedule 03.07.2017