Самый простой способ сериализации и отправки графа объектов через веб-сервис WCF - PullRequest
0 голосов
/ 09 июня 2011

Какой самый простой способ отправлять сложные графики произвольных типов данных из службы WCF, например, в клиент Silverlight? Здесь DataContractSerializer упоминается как механизм сериализации по умолчанию для WCF. В нем также говорится, что «Все общедоступные типы, которые имеют конструктор без параметров», могут быть сериализованы. Для меня это звучит так, как если бы можно было отправлять произвольные типы через службу WCF. Это правда? Вам не нужны DataContracts, атрибуты XmlElement и тому подобное? Предполагается, что это правда, какие ограничения на стороне клиента существуют (например, только клиенты, которые используют (подмножество) .NET Framework)?

Кроме того, было бы очень хорошо, если бы вы сказали мне, какой лучший поток будет использовать в сочетании с DataContractSerializer.WriteObject (Stream stream, Object graph) для клиента Silverlight.

1 Ответ

1 голос
/ 09 июня 2011

Да, это правда, вам не нужно украшать класс с помощью [DataContract], [Serializable], [Xml ...], чтобы WCF его сериализовал. Вы можете отправлять произвольные типы , если они следуют определенному шаблону (конструктор без параметров, только сериализация открытых полей / свойств). Есть хорошая статья о сериализации POCO (простых старых объектов CLR) в WCF по адресу http://www.pluralsight -training.net / community / blogs / aaron / archive / 2008/05/13 / 50934.aspx .

Что касается ограничений других клиентов, таких как Silverlight, если типы поддерживаются в клиенте, то он также должен работать.

И для вашего последнего вопроса это не имеет значения (до тех пор, пока вы можете писать в поток). Если вы хотите сериализовать объект в файл (в изолированном хранилище Silverlight), вам, скорее всего, придется использовать FileStream; если вы хотите сериализовать объект по сети напрямую, вы можете использовать поток, возвращаемый HttpWebRequest.EndGetRequestStream; если вы хотите сделать некоторые манипуляции в памяти, вы можете использовать MemoryStream. Но для сериализатора это не имеет значения. Для DCS это просто поток.

Еще одна вещь, если у вас есть служба WCF и вы используете ее с помощью Silverlight (например, с помощью добавления ссылки на службу - ASR - для создания прокси-сервера к ней), вам не нужно беспокоиться о сериализации - прокси, сгенерированный мастером ASR, будет использовать внутренние классы WCF для обработки сериализации для вас, все, что вам нужно сделать, это вызвать методы в прокси, передавая объекты напрямую.

...