Отправка объекта Tuple через WCF? - PullRequest
15 голосов
/ 29 апреля 2010

Поддерживается ли класс System.Tuple в сериализаторе контрактов данных WCF (т. Е. Могу ли я передавать объекты Tuple в вызовы WCF и / или получать их как часть или весь результат)?

Я нашел эту страницу , но не ясный, окончательный ответ "Вы можете отправлять и получать кортежи с WCF", на который я надеялся.

Полагаю, что вы можете, если все типы в самом Tuple поддерживаются сериализатором контракта данных - может кто-нибудь дать мне более точный ответ? Спасибо.

Ответы [ 3 ]

16 голосов
/ 29 апреля 2010

Типы Tuple помечены SerializableAttribute, поэтому, если типы, которые вы храните внутри, являются сериализуемыми, они также могут быть сериализованы WCF.

Выезд: ссылки Tuple'1 , Tuple'2 и т. Д. Там написано:

[SerializableAttribute]
public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITuple

Обратите внимание, что документ, на который вы ссылались, содержит следующую строку:

Модель программирования [Serializable] / ISerializable не поддерживается в среде с частичным доверием.

Так что, это может быть не так просто, как кажется.

(Кстати, статический класс Tuple также стоит проверить.)

9 голосов
/ 17 августа 2010

Я просто копался в этом сам, и, похоже, одна проблема может заключаться в том, что вы используете сервис WCF через Silverlight: см. блог Дэви Брайона для получения дополнительной информации.

Версия Tuple в Silverlight не имеет атрибута Serializable, что создает проблему в настоящее время.

5 голосов
/ 05 ноября 2010

У меня Tuples прекрасно работают с .NET 4.0 и WCF (напоминание: вам нужна .NET 4.0 для поддержки Tuple).

Вот метод модульного теста (который вызывает метод через слой WCF):

/// <summary>
/// Test Tuples
/// </summary>
[TestMethod()]
public void WcfTestTupleUnit()
{
  Tuple<double, double> x;
  x=CallViaWCF.testTuple();
  Assert.AreEqual(x.Item1, 42);
  Assert.AreEqual(x.Item2, 43);
}
#endregion

Вот интерфейс:

[OperationContract]
Tuple<double, double> testTuple();

Вот реализация:

public Tuple<double, double> testTuple()
{
  return new Tuple<double, double>(42, 43);
}

Я только что проверил это с помощью отладки, используя «Приложение-службу WCF» (см. New..Project), которое обслуживает службу WCF. Я использую этот метод для отладки, так как я могу использовать отладчик для плавного перехода от клиента WCF к службе WCF и обратно, что иногда очень полезно.

Я также только что проверил этот метод, развернув его как в консольном приложении, так и в сервисном приложении, поэтому он определенно работает для меня.

...