Visual Studio 的“添加服务引用”如何反序列化对象

本文关键字:反序列化 对象 引用 服务 Studio 添加 Visual | 更新日期: 2023-09-27 18:35:12

在项目上使用Add Service Reference时,Visual Studio 2013如何反序列化对象?我问是因为我有以下课程:

    public class RTMImagePackage
    {
        private int maxImages = 15;
        [DataMember(EmitDefaultValue = false)]
        public int MaxImages
        {
            get { return this.maxImages; }
            private set { this.maxImages = value; }
        }
        [OnDeserialized]
        void OnDeserialized(StreamingContext c)
        {
            if (maxImages == 0)
            {
                maxImages = 15;
            }
        }
    }

如果我使用本地 IIS 自托管,然后创建一个单独的项目并使用 Add Service Reference 添加此 WCF 服务,则 RTMImagePackage 的任何新实例的MaxImages值始终为 0,即使我在多个位置将其设置为 15,即使在以 OnDeserialized 开头的方法中也是如此。

如果我抛出一些断点,我可以看到 OnDeserialized 方法甚至从未在 Web 服务端调用过,即使我尝试使用断点更新服务引用也是如此。

基本上,我试图保证客户端在生成代理类时始终将MaxImages设置为 15,不必使用分部类。有没有明确的方法来做到这一点?我已经检查了其他答案,他们的方法是使用OnDeserializedOnDeserializing但这似乎对我不起作用。

有什么提示吗?

Visual Studio 的“添加服务引用”如何反序列化对象

Visual Studio 无法使用"添加服务引用向导1"探测有关基础 .NET 类的信息。它所要做的只是 WCF 服务生成的 WSDL,并且 WSDL 不会有任何办法说服务的具体类之一的数据成员之一具有初始值为 15 的支持字段。

此外,如果反序列化期间该支持字段当前为 0,则客户端无法知道类的 OnDeserialized 方法将该支持字段设置为 15。 OnDeserialized 是在服务从客户端接收数据时运行的方法。OnDeserialized方法的行为不会作为服务接口的一部分公开。

据我所知,我没有看到任何在 WCF 接口中指示自定义默认值的方法,我可以找到的有关使用自定义默认值的所有建议都推荐您已经在使用的OnDeserialized方法。

但是,如果使用 ChannelFactories 而不是"添加服务引用"生成的代理,则客户端应用程序可以对服务数据对象使用 .NET 定义,并且可以在服务和客户端之间共享这些定义。换句话说,客户端可以实例化共享程序集中定义的RTMImagePackage实例,而不是使用服务代理类。这应该允许您执行诸如包含默认值和其他无法纯粹从 WSDL 确定的事情。

有关ChannelFactory的更多信息可以在这里找到:http://www.codeproject.com/Tips/558163/Difference-between-Proxy-and-Channel-Factory-in-WC


1 事实上,首先不应该在class中定义服务的接口。它应该在interface中定义。

我不确定如何触发OnDeserialized方法,所以我不会谈论它。

基本序列化需要公共getset访问器。您有一个公共get,但您的set是私人的。将这两个都设置为公共,并且您的对象应正确序列化。