Отправка объекта 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 и обратно, что очень полезно время от времени.
Я также просто протестировал этот метод, развернув его как в консольном приложении, так и в сервисном приложении, поэтому он определенно работает для меня.