Отправка объекта Tuple поверх WCF?

Является ли класс System.Tuple, поддерживаемый Сериализатором контрактов данных WCF (т.е. можно передать объекты Tuple в вызовы WCF и/или получать их как часть или весь результат)?

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

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

Ответы

Ответ 1

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

Отъезд: ссылки Tuple'1, Tuple'2 и т.д. В нем говорится:

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

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

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

Итак, это может быть не так просто, как казалось бы.

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

Ответ 2

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

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

Ответ 3

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

Вот метод unit test (который вызывает этот метод через слой 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 и обратно, что очень полезно время от времени.

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