Подтвердить что ты не робот

Как сериализовать IList <T>?

У меня есть OR mapper (iBatis.Net), который возвращает IList.

// IList<T> QueryForList<T>(string statementName, object parameterObject);
var data = mapper.QueryForList<Something>(statement, parameters);

Я пытаюсь использовать его в веб-сервисе и хочу вернуть данные 1:1. Конечно, я не могу вернуть IList в WebMethod, потому что это интерфейс и поэтому не сериализуем.

Я обнаружил, что mapper действительно возвращает List. Но я боюсь перечислить его в список, потому что, конечно, внутренняя работа mappers может измениться в будущих версиях (и это просто кажется грязным).

Так что я должен...

a) return new List<Something>(data);

b) return (List<Something>)data;

c) // your solution here

Спасибо большое!

4b9b3361

Ответ 1

Если это действительно List<T>, но вы хотите защитить от изменений и все еще работать, то наиболее эффективным решением будет попытка включить его в список, а если это не удастся, то создайте новый список из его содержание, например

var data = mapper.QueryForList<T>(statement, parameters);
var list = data as List<T> ?? new List<T>(data);

Однако вы отмечаете, что вы не можете вернуть интерфейс, потому что это веб-сервис. Это могло быть правдой с ASMX и классом XmlSerializer, но если вы создаете веб-службу с помощью WCF и используете DataContractSerializer, тогда она будет счастливо сериализовать интерфейсы коллекции (как входы, так и выходы из службы). Этот тип изменений может быть несколько больше, чем вы ищете!

Ответ 2

Зачем вам сериализовать IList:) Просто используйте его как источник для своей собственной коллекции и сериализуйте его:

var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))

Ответ 3

Я не думаю, что вам нужен c). Должно быть довольно безопасно использовать решение а).

Это решение зависит от публичного api IBatis.net. Хорошие api не изменяют свою публичную api, если это действительно единственное решение критически важной задачи.

Надеюсь, что это поможет.