首先我们要了解 web Service传递的数据只能是序列化的数据,典型的就是xml数据。个人理解就是类似于实体类对象的参数是不需要经过序列化然后传递到webService中,然后在web Service中进行反序列化后或者(XmlInclude,SoapInclude)

[NonSerialized] 不序列化

 [Serializable] 序列化

XmlInclude,SoapInclude:向Web Service 里 解释你Include的几个类型,如果不解释,调用方法时会报:“使用 XmlInclude 或 SoapInclude 属性静态指定非已知的类型。”这种错误

XmlIncludeAttribute的定义如下:允许 XmlSerializer 在它序列化或反序列化对象时识别类型。所以我想是因为方法返回的类型其实是House类的子类,XmlSerializer在序列化时只能识别父类,而不能识别子类,如果有父类和子类同时出现时。应该将父类和子类都反序列化进来,所以我将[XmlInclude(typeof(SaleHouse))]和[XmlInclude(typeof(RentHouse))]同时加到WebService中。

 

 

C# Serializable

System.SerializableAttribute

串行化是指存储和获取磁盘文件、内存或其他地方中的对象。在串行化时,所有的实例数据都保存到存储介质上,在取消串行化时,对象会被还原,且不能与其原实例区别开来。

只需给类添加Serializable属性,就可以实现串行化实例的成员。

并行化是串行化的逆过程,数据从存储介质中读取出来,并赋给类的实例变量。

例:

 

 

1关于 web service 参数传递的序列化反序列化问题    [Serializable] 2关于 web service 参数传递的序列化反序列化问题    publicclass Person 3关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题    关于 web service 参数传递的序列化反序列化问题{ 4关于 web service 参数传递的序列化反序列化问题        public Person() 5关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题        关于 web service 参数传递的序列化反序列化问题{ 6关于 web service 参数传递的序列化反序列化问题        } 7关于 web service 参数传递的序列化反序列化问题 8关于 web service 参数传递的序列化反序列化问题        publicint Age; 9关于 web service 参数传递的序列化反序列化问题        publicint WeightInPounds; 10关于 web service 参数传递的序列化反序列化问题    }

    下面来看一个小例子,首先要添加命名空间

 

 

using System.Runtime.Serialization.Formatters.Binary;

下面的代码将对象Person进行序列化并存储到一个文件中

 

  

 

1关于 web service 参数传递的序列化反序列化问题            Person me =new Person(); 2关于 web service 参数传递的序列化反序列化问题 3关于 web service 参数传递的序列化反序列化问题            me.Age =34; 4关于 web service 参数传递的序列化反序列化问题            me.WeightInPounds =200; 5关于 web service 参数传递的序列化反序列化问题 6关于 web service 参数传递的序列化反序列化问题            Stream s = File.Open("Me.dat",FileMode.Create); 7关于 web service 参数传递的序列化反序列化问题 8关于 web service 参数传递的序列化反序列化问题            BinaryFormatter bf =new BinaryFormatter(); 9关于 web service 参数传递的序列化反序列化问题10关于 web service 参数传递的序列化反序列化问题            bf.Serialize(s,me); 11关于 web service 参数传递的序列化反序列化问题12关于 web service 参数传递的序列化反序列化问题            s.Close();

    然后再举一个并行化的例子

  

 

关于 web service 参数传递的序列化反序列化问题            Stream s = File.Open("Me.dat",FileMode.Open); 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题            BinaryFormatter bf =new BinaryFormatter(); 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题            object o = bf.Deserialize(s); 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题            Person p = o as Person; 关于 web service 参数传递的序列化反序列化问题            if(p !=null) 关于 web service 参数传递的序列化反序列化问题                Console.WriteLine("DeSerialized Person aged:{0} whight:{1}",p.Age,p.WeightInPounds); 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题            s.Close();

    如果需要对部分字段序列化部分不序列化时,我们可以按照如下设置实现

 

 

 

关于 web service 参数传递的序列化反序列化问题    [Serializable] 关于 web service 参数传递的序列化反序列化问题    publicclass Person 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题    关于 web service 参数传递的序列化反序列化问题{ 关于 web service 参数传递的序列化反序列化问题        public Person() 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题        关于 web service 参数传递的序列化反序列化问题{ 关于 web service 参数传递的序列化反序列化问题        } 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题        publicint Age; 关于 web service 参数传递的序列化反序列化问题        [NonSerialized] 关于 web service 参数传递的序列化反序列化问题        publicint WeightInPounds; 关于 web service 参数传递的序列化反序列化问题    }

  2.

关于 web service 参数传递的序列化反序列化问题  Serializable在C#中的作用.NET 中的对象序列化 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题简介 关于 web service 参数传递的序列化反序列化问题序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化。以下各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您可以根据需要自定义序列化过程的一些重要功能。 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题持久存储 关于 web service 参数传递的序列化反序列化问题我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题公共语言运行时 (CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为 Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题按值封送 关于 web service 参数传递的序列化反序列化问题对象仅在创建对象的应用程序域中有效。除非对象是从 MarshalByRefObject 派生得到或标记为 Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题如果对象是从 MarshalByRefObject 派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从 MarshalByRefObject 派生得到的对象标记为 Serializable。远程使用此对象时,负责进行序列化并已预先配置为 SurrogateSelector 的格式化程序将控制序列化过程,并用一个代理替换所有从 MarshalByRefObject 派生得到的对象。如果没有预先配置为 SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则(请参阅序列化过程的步骤)。 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题基本序列化 关于 web service 参数传递的序列化反序列化问题要使一个类可序列化,最简单的方法是使用 Serializable 属性对它进行标记,如下所示: 关于 web service 参数传递的序列化反序列化问题关于 web service 参数传递的序列化反序列化问题[Serializable] 某些数据成员包含敏感信息。在这种情况下,建议实现 ISerializable 并仅序列化所要求的字段。

相关文章: