.NET Remoting——practice & progress(4):Parameter参数

来源:互联网 发布:java constructor类型 编辑:程序博客网 时间:2024/06/06 09:44
 当调用Remote Object方法时,有时需要输入参数。由于Remote Object是运行在服务器端,服务器端并无法获得对客户端输入参数的对象引用。因此,输入参数必须是以按值传递方式来传递给运行在服务器端的远程对象。换句话说:输入参数一定支持可序列化的对象。

         输入参数对象事例代码如下:

    [Serializable]

    public class NumbericalValue//: MarshalByRefObject

{

     private int decimalDigits;

        /// <summary>

        /// 小数点位数(精度)

        /// </summary>

        public int DecimalDigits

        {

            get { return decimalDigits; }

            set { decimalDigits = value; }

        }

 

       public NumbericalValue(int decimalDigits)

        {

            this.decimalDigits = decimalDigits;

        }

     }

         客户端代码事例如下:

// NumbericalValue类已经加了Serializable标记,表明此类支持序列化

double result = calculator.Division(firstNumber, secondNumber, new NumbericalValue(3));

         若是以值类型参数输入时,由于值类型本身就支持可序列化,所以无需再作任何处理。

          Remote Object处理完后,有时需要返回参数。返回参数可以以按值返回,也可以按引用返回。若是按值返回,需给类注明[Serializable]若是按引用返回,必须继承MarshalByRefObject返回的对象也是一个远程对象,也必须接受.NET Remoting对远程对象的管理。管理方式会自动继承被调用的远程对象。

         远程对象事例代码如下:

    public class Calculator : MarshalByRefObject

    {

        public NumbericalValue GetPI()

        {

            double pi = Math.PI;

            NumbericalValue numbericalValue = new NumbericalValue(8);

            numbericalValue.IntegralValue = (int)pi;

            numbericalValue.DecimalValue = int.Parse(pi.ToString().Substring(pi.ToString().IndexOf(".")+1,int.MaxValue.ToString().Length-1));

            numbericalValue.Structure();

            return numbericalValue;

        }

}

//返回对象类

    [Serializable]

    public class NumbericalValue//: MarshalByRefObject

    {

        //整数值

        private int integralValue;

        //小数点位数(精度)

        private int decimalDigits;

        //小数值

        private int decimalValue;

 

        /// <summary>

        /// 整数值

        /// </summary>

        public int IntegralValue

        {

            get { return integralValue;}

            set { integralValue = value;}

        }

        /// <summary>

        /// 小数点位数(精度)

        /// </summary>

        public int DecimalDigits

        {

            get { return decimalDigits; }

            set { decimalDigits = value; }

        }

        /// <summary>

        /// 小数值

        /// </summary>

        public int DecimalValue

        {

            get { return decimalValue;}

            set { decimalValue = value;}

        }

 

        public NumbericalValue(int decimalDigits)

        {

            this.decimalDigits = decimalDigits;

        }

 

        /// <summary>

        /// 按照小数位数构建小数值

        /// </summary>

        public void Structure()

        {

            if (decimalValue.ToString().Length < decimalDigits.ToString().Length)

                decimalValue = int.Parse(decimalValue.ToString().Substring(0, decimalDigits));

        }

    }

}

         客户端代码事例如下:

processResultTextBox.Text += "开始获取远程对象方法返回值" + Environment.NewLine;

NumbericalValue pi = calculator.GetPI();

processResultTextBox.Text += "完成获取远程对象方法返回值。" + Environment.NewLine;

processResultTextBox.Text += "返回值为:" + pi.IntegralValue.ToString() +"."+ pi.DecimalValue.ToString() + Environment.NewLine;

processResultTextBox.Text += "返回值对象类型是否远程对象代理:" + RemotingServices.IsTransparentProxy(pi).ToString() + Environment.NewLine;

         两种返回参数运行效果图
输入输出参数

 

原创粉丝点击