如何序列化自定义类

时间:2021-09-08 19:22:08
开发中webservice需要引用其他共享软件中的类库,但是在客户端使用该webservice接口时提示,无法序列化,咋办?

添加web引用时提示如下错误:

“/Website/ServiceLogic”应用程序中的服务器错误。
--------------------------------------------------------------------------------

无法序列化接口 ESRI.ArcGIS.Geodatabase.IDataset。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.NotSupportedException: 无法序列化接口 ESRI.ArcGIS.Geodatabase.IDataset。

源错误: 

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  

堆栈跟踪: 


[NotSupportedException: 无法序列化接口 ESRI.ArcGIS.Geodatabase.IDataset。]
   System.Xml.Serialization.TypeDesc.CheckSupported() +845309
   System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError) +170
   System.Xml.Serialization.XmlReflectionImporter.ImportMemberMapping(XmlReflectionMember xmlReflectionMember, String ns, XmlReflectionMember[] xmlReflectionMembers, Boolean rpc, Boolean openModel) +78
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement, Boolean rpc, Boolean openModel) +278

[InvalidOperationException: 反射“o”时出错。]
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlReflectionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement, Boolean rpc, Boolean openModel) +877
   System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(String elementName, String ns, XmlReflectionMember[] members, Boolean hasWrapperElement, Boolean rpc, Boolean openModel, XmlMappingAccess access) +111
   System.Web.Services.Protocols.SoapReflector.ImportMembersMapping(XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, Boolean serviceDefaultIsEncoded, Boolean rpc, SoapBindingUse use, SoapParameterStyle paramStyle, String elementName, String elementNamespace, Boolean nsIsDefault, XmlReflectionMember[] members, Boolean validate, Boolean openModel, String key, Boolean writeAccess) +203
   System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) +2460

[InvalidOperationException: 无法反射方法 ServiceLogic.loadMap。]
   System.Web.Services.Protocols.SoapReflector.ReflectMethod(LogicalMethodInfo methodInfo, Boolean client, XmlReflectionImporter xmlImporter, SoapReflectionImporter soapImporter, String defaultNs) +6904
   System.Web.Services.Description.SoapProtocolReflector.ReflectMethod() +133
   System.Web.Services.Description.ProtocolReflector.ReflectBinding(ReflectedBinding reflectedBinding) +2760
   System.Web.Services.Description.ProtocolReflector.Reflect() +739
   System.Web.Services.Description.ServiceDescriptionReflector.ReflectInternal(ProtocolReflector[] reflectors) +621
   System.Web.Services.Description.ServiceDescriptionReflector.Reflect(Type type, String url) +117
   System.Web.Services.Protocols.DocumentationServerType..ctor(Type type, String uri) +159
   System.Web.Services.Protocols.DocumentationServerProtocol.Initialize() +336
   System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) +99

[InvalidOperationException: 无法处理请求。]
   System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing) +258
   System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +90

[InvalidOperationException: 处理请求失败。]
   System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +237
   System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +104
   System.Web.HttpApplication.MapHttpHandler(HttpContext context, String requestType, VirtualPath path, String pathTranslated, Boolean useAppConfig) +175
   System.Web.MapHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +120
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

 


--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:2.0.50727.42; ASP.NET 版本:2.0.50727.210

5 个解决方案

#1


你要将所用类库中方法的参数都标识为可以被序列化才能被WebService调用.
也就是你一定要保证所用到的数据类型都有一个[Serializable]属性.

具体你可以看一下MSDN关于[Serializable]的解释.

#2


.NET Framework 类库  
SerializableAttribute 成员  
指示一个类可以序列化。无法继承此类。

将 SerializableAttribute 属性应用于一个类型可指示该类型的实例可以序列化。如果正在序列化的对象图中的任何类型未应用 SerializableAttribute 属性,公共语言运行库则会引发 SerializationException。

即使该类也会实现 ISerializable 接口来控制序列化进程,仍要应用 SerializableAttribute 属性。

默认情况下,类型中由 SerializableAttribute 标记的所有公共和私有字段都会进行序列化,除非该类型实现 ISerializable 接口来重写序列化进程。默认的序列化进程会排除用 NonSerializedAttribute 属性标记的字段。如果可序列化类型的字段包含指针、句柄或其他某些针对于特定环境的数据结构,并且不能在不同的环境中以有意义的方式重建,则最好将 NonSerializedAttribute 属性应用于该字段。

#3


无法序列化接口 ESRI.ArcGIS.Geodatabase.IDataset。
使用可序列化的类继承该接口,作为webservice返回值或参数,应该就可以了

#4


[Serializable]
public classs myclass
{
}

#5


多谢各位!

#1


你要将所用类库中方法的参数都标识为可以被序列化才能被WebService调用.
也就是你一定要保证所用到的数据类型都有一个[Serializable]属性.

具体你可以看一下MSDN关于[Serializable]的解释.

#2


.NET Framework 类库  
SerializableAttribute 成员  
指示一个类可以序列化。无法继承此类。

将 SerializableAttribute 属性应用于一个类型可指示该类型的实例可以序列化。如果正在序列化的对象图中的任何类型未应用 SerializableAttribute 属性,公共语言运行库则会引发 SerializationException。

即使该类也会实现 ISerializable 接口来控制序列化进程,仍要应用 SerializableAttribute 属性。

默认情况下,类型中由 SerializableAttribute 标记的所有公共和私有字段都会进行序列化,除非该类型实现 ISerializable 接口来重写序列化进程。默认的序列化进程会排除用 NonSerializedAttribute 属性标记的字段。如果可序列化类型的字段包含指针、句柄或其他某些针对于特定环境的数据结构,并且不能在不同的环境中以有意义的方式重建,则最好将 NonSerializedAttribute 属性应用于该字段。

#3


无法序列化接口 ESRI.ArcGIS.Geodatabase.IDataset。
使用可序列化的类继承该接口,作为webservice返回值或参数,应该就可以了

#4


[Serializable]
public classs myclass
{
}

#5


多谢各位!