【发布时间】:2013-02-19 11:29:09
【问题描述】:
[编辑] 我现在已经使用构造函数和调用客户端代码以及 OnDeserializing() 和 OnDeserialized() 方法编辑了 D。
我有一个 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)
显然这不会改变任何东西,在这两种情况下,当我在服务代码(getArray 方法的代码)中收到 d 时,它的所有字段都是空的。这是为什么?有什么我遗漏的吗?
我知道(使用启用跟踪并查看传输层的消息)字段的传输层值正在在线上正确传输。我还向对象添加了 OnDeserialized() 和 OnDeserializing() 方法,以便我可以在断点 (1) 和 (2) 处放置一个断点,所有字段都为空?! 实际上根本没有调用对象设置器!
我的想法已经用完了......
【问题讨论】:
-
你确定你真正的
D实现就像显示的那样吗?可能是ctor中的字段初始化有问题吗? -
谢谢,是的,我有一个构造函数,我已经编辑了我的帖子以反映这一点。现在有什么明显的问题吗?
-
我会尝试添加默认的
ctor(protected,因为您可能不希望它是public)。也许这会导致反序列化问题。 -
没有任何差异。我仍然得到空值。
-
您能否显示调用
getArray的代码,以及您作为参数传递的内容?我想看看你在哪里初始化D d。