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

时间:2014-12-23 20:26:13

标签: c# .net visual-studio wcf serialization

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

    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开头的方法中也是如此。

如果我抛出一些断点,我可以看到即使我尝试使用断点更新服务引用,也永远不会在Web服务端调用OnDeserialized方法。

基本上我试图保证客户端在生成代理类 WITHOUT 必须使用分部类时始终将MaxImages设置为15。有明确的方法吗?我已经检查了其他答案,他们的方法是使用OnDeserializedOnDeserializing,但这似乎并不适用于我。

任何提示?

2 个答案:

答案 0 :(得分:4)

Visual Studio无法使用“添加服务引用”向导 1 来探测有关基础.NET类的信息。所有必须继续的是你的WCF服务生成的WSDL,并且WSDL没有任何方式可以说任何一个服务的具体类的数据成员都有一个带有初始值的支持字段价值15。

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

从我可以确定的,我没有看到任何在WCF界面中指示自定义默认值的方法,并且我在使用自定义默认值时可以找到的所有建议都推荐OnDeserialized方法你已经在使用了。

但是,如果您使用ChannelFactories而不是Add Service Reference生成的代理,您的客户端应用程序可以使用.NET定义作为服务数据对象,这些可以在您的服务和客户端之间共享。换句话说,您的客户端可以实例化在共享程序集中定义的RTMImagePackage实例,而不是使用服务代理类。这应该允许你做一些事情,比如包括默认值和其他无法从WSDL中确定的东西。

有关ChannelFactories的更多信息,请访问: http://www.codeproject.com/Tips/558163/Difference-between-Proxy-and-Channel-Factory-in-WC

<小时/> 1 事实上,您的服务界面不应该首先在class中定义。它应该在interface

中定义

答案 1 :(得分:0)

我不确定OnDeserialized方法是如何触发的,所以我不会说话。

基本序列化需要公开getset个访问者。您已公开get,但您的set是私密的。将这两个设置为公共,您的对象应该正确序列化。