[EDIT] Теперь я редактировал конструктор D и код вызова в методах клиента и OnDeserializing() и OnDeserialized().Передача объекта с использованием DataContract в WCF
У меня есть служба WCF (поверх именованной трубы) и клиент. Мне нужно передать объект (и предпочтительно ссылку на этот объект) в качестве аргумента моего OperationContract.
[DataContract]
public class D
{
[DataMember]
public int Id;
[DataMember]
public string StrId;
//...
public D(int id, string strid)
{
Id = id;
StrId = strid;
//...
}
[OnDeserialized]
void OnDeserialized(StreamingContext strmCtx)
{
} // breakpoint here (1)
[OnDeserializing]
void OnDeserializing(StreamingContext strmCtx)
{
} // breakpoint here (2)
}
и это контракт на обслуживание:
[ServiceContract]
public interface ICalc
{
[OperationContract]
int Calculate(string date, int count);
// d is input of this method, and count and array are outputs.
[OperationContract]
int getArray(ref int count, ref int[] array, D d);
}
Это мой код клиента, где GetArray вызывается:
proxy.getArray(ref myCount, ref myIntArray, new D(source))
Я также попытался это:
D d = new D(source)
proxy.getArray(ref myCount, ref myIntArray, d)
Очевидно, что это не изменить что-либо, в обоих случаях, когда я получаю d в служебном коде (код метода getArray), все его поля равны нулю. Почему это? Есть что-то, чего я не хватает?
Я знаю, что (используя разрешающие трассы и просматривая сообщения на транспортном уровне) на уровне транспортного уровня поля правильно переносятся на провод. Я также добавил методы OnDeserialized() и OnDeserializing() к объекту, чтобы я мог разместить там точку останова, в точках останова (1) и (2) все поля равны нулю! !! на самом деле объектные сеттеры вообще не называются !!
Я бегу из идей здесь ....
Вы уверены, что ваша настоящая реализация 'D', как показано? Может быть, проблема с инициализацией полей в ctor или что-то еще? – UserControl
Спасибо, да, у меня есть конструктор, я отредактировал свое сообщение, чтобы это отразить. есть ли что-то явно неправильное? – jambodev
Я бы постарался добавить default 'ctor' (' protected', поскольку вы, вероятно, не хотите, чтобы это было 'public'). Возможно, это вызывает проблему десериализации. – UserControl