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

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

14 голосов
/ 21 января 2009

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

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

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

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

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

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

b) return (List<Something>)data;

c) // your solution here

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

Ответы [ 3 ]

16 голосов
/ 21 января 2009

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

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

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

2 голосов
/ 21 января 2009

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

var data = mapper.QueryForList<T>(statement, parameters);
var yourList = new List<T>(data);
//Serialize yourList here ))
0 голосов
/ 21 января 2009

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

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

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

...