如何向web service里的方法传递一个对象类型的参数,请指教!

NetUp001 2005-04-08 10:55:30
我定义了一个类,像把这个类的实例传给webservice里的方法进行处理?要怎么做?
...全文
1037 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
将就点 2005-04-13
  • 打赏
  • 举报
回复
如果有2次编译的功能和过程的话,是不是方法就可以序列化了呢?
应该可以的吧?
epimetheus 2005-04-13
  • 打赏
  • 举报
回复
mark
dianweihu 2005-04-13
  • 打赏
  • 举报
回复
WebService代理类A的名字空间与实际的类A的名字空间不一致,怎么办?
在调用WebService.MethodA(WSNameSpaceA a)中a的名字空间为代理类的名字空间
而实际调用时传入的不是实际的类实例,名字空间不一致
总是提示不能转换类型...
该怎么办?
jhqjhq 2005-04-12
  • 打赏
  • 举报
回复
为什么叫“序列化”啊?搞的象vc++里的序列化一样。
应该叫 实例化 撒。
rottenapple 2005-04-09
  • 打赏
  • 举报
回复
方法是没有办法序列化的
机器人 2005-04-08
  • 打赏
  • 举报
回复
Person类的定义:
Public Class Person
Inherits System.Attribute

Public Name As String
Public Age As String
End Class

我们可以看到在本地Person的代理类:
'<remarks/>
<System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://tempuri.org/ExcelService/Service1")> _
Public Class Person
Inherits Attribute

'<remarks/>
Public Name As String

'<remarks/>
Public Age As String
End Class

'<remarks/>
<System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://tempuri.org/ExcelService/Service1"), _
System.Xml.Serialization.XmlIncludeAttribute(GetType(Person))> _
Public MustInherit Class Attribute
End Class
机器人 2005-04-08
  • 打赏
  • 举报
回复
只要你的类继承于System.Attribute就可以了。
例子:
<WebMethod()> _
Public Function DisplayPersonInfo(ByVal objPerson As Person) As String
Dim person As Person = objPerson
Return person.Name
End Function

调用:
Dim myWebSvc As WebSvc.PA0010SVC = New WebSvc.PA0010SVC
Dim p As WebSvc.Person = New WebSvc.Person
p.Name = "Peter"
p.Age = "23"
Dim strPersonName As String = "null"
strPersonName = myWebSvc.DisplayPersonInfo(p)
LoveCherry 2005-04-08
  • 打赏
  • 举报
回复
将自定义类在webservice里序列化成字符串,传到客户端,然后客户端再反序列化成类的实例。
自定义类:
public class myclass
{
[XmlElement]
public string str;
}

web服务:
public string getclass()
{
myclass mc = new myclass();
XmlSerilazier xs = new XmlSerilazier(typeof(myclass));
MemoryStream ms = new MemoryStream();
xs.Serialize(mc,ms);
ms.Seek(0,SeekOrigin.Begin);

byte[] buffer = new byte[ms.Length];
int n=ms.Read(buffer,0,buffer.Length);
ms.Close();

return System.Text.Encoding.UTF8.GetString(buffer,0,n);
}

客户端:
public myclass GetMyClass(string str)
{
MemoryStream ms = new MemoryStream();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
ms.Write(buffer,0,buffer.Length);
ms.Seek(0,SeekOrigin.Begin);
XmlSerializer xs = new XmlSerializer(typeof(myclass));
myclass mc = (myclass)xs.Deserialize(ms);
ms.Close();
return mc;
}

你的需求分之就可以了
Tomgus 2005-04-08
  • 打赏
  • 举报
回复
一些参考吧 :)

基本序列化

令一个类可序列化的最简单的方式是按如下所示使用 Serializable 属性标记它。

[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
以下代码段说明该类的实例是如何被序列化到一个文件中的。

MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
该示例使用二进制格式化程序执行序列化。您需要做的所有工作就是创建流的实例和您想要使用的格式化程序,然后对该格式化程序调用 Serialize 方法。要序列化的流和对象实例被作为参数提供给该调用。尽管在此示例中并没有显式阐释这一点,但一个类的所有成员变量都将被序列化,即使是那些已被标记为私有的变量。在此方面,二进制序列化不同于 XML 序列化程序,后者只序列化公共字段。

将对象还原回其以前的状态十分简单。首先,创建用于读取的流和格式化程序,然后指示格式化程序反序列化该对象。下面的代码段说明如何执行上述的操作。

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();

// Here's the proof
Console.WriteLine("n1: {0}", obj.n1);
Console.WriteLine("n2: {0}", obj.n2);
Console.WriteLine("str: {0}", obj.str);
上面所用的 BinaryFormatter 是非常有效的,并且生成非常简洁的字节流。通过该格式化程序序列化的所有对象都还可以通过该格式化程序被反序列化,这使该工具对于序列化将在 .NET 平台上被反序列化的对象而言十分理想。需要特别注意的是,在反序列化一个对象时不调用构造函数。出于性能方面的原因对反序列化施加了该约束。但是,这违反了运行库生成的与对象编写器有关的一些通常协定,并且开发人员应确保他们在将对象标记为可序列化时理解其后果。

如果可移植性是必需的,则代之以使用 SoapFormatter。只需用 SoapFormatter 代替上面代码中的格式化程序,并且如前面一样调用 Serialize 和 Deserialize。此格式化程序为上面使用的示例生成以下输出。

<SOAP-ENV:Envelope
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP- ENC=http://schemas.xmlsoap.org/soap/encoding/
xmlns:SOAP- ENV=http://schemas.xmlsoap.org/soap/envelope/
SOAP-ENV:encodingStyle=
"http://schemas.microsoft.com/soap/encoding/clr/1.0
http://schemas.xmlsoap.org/soap/encoding/"
xmlns:a1="http://schemas.microsoft.com/clr/assem/ToFile">

<SOAP-ENV:Body>
<a1:MyObject id="ref-1">
<n1>1</n1>
<n2>24</n2>
<str id="ref-3">Some String</str>
</a1:MyObject>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
需要特别注意的是,Serializable 属性不能被继承。如果我们从 MyObject 派生一个新类,此新类必须也用该属性标记,否则它不能被序列化。例如,当您试图序列化下面的类的实例时,您将获得 SerializationException,它通知您 MyStuff 类型没有被标记为可序列化。

public class MyStuff : MyObject
{
public int n3;
}
使用序列化属性十分方便,但它可能具有上面阐释的局限性。有关何时您应为序列化标记类,请参考在序列化指导方针中提供的指导方针,因为在类已被编译后您不能将序列化添加到该类上。
Tomgus 2005-04-08
  • 打赏
  • 举报
回复
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,就使得数据能够被轻松地存储和传输。

.NET 框架提供两种序列化技术:

二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享该对象。可将对象序列化到流、磁盘和内存等,还可以通过网络序列化对象。远程处理使用序列化“通过值”将对象从一台计算机或一个应用程序域传递到另一台计算机或另一个应用程序域。

XML 序列化仅序列化公共属性和字段,且不保留类型保真度。当您希望提供或使用数据而不限制使用该数据的应用程序时,这很有用。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据,它是一个有吸引力的选择。SOAP 是一个开放式标准,这使它也成为一个颇具吸引力的选择。
Tomgus 2005-04-08
  • 打赏
  • 举报
回复
序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。

在面向对象的环境中实现序列化机制时,必须在易用性和灵活性之间进行一些权衡。只要您对此过程有足够的控制能力,就可以使该过程在很大程度上自动进行。例如,简单的二进制序列化不能满足需要,或者,由于特定原因需要确定类中那些字段需要序列化。以下各部分将探讨 .NET 框架提供的可靠的序列化机制,并着重介绍使您可以根据需要自定义序列化过程的一些重要功能
详细情况参见:
http://www.5xsoft.com/data/200202/2008083101.htm
NetUp001 2005-04-08
  • 打赏
  • 举报
回复
如何序列化一个对象,传递给webservice的方法?
NetUp001 2005-04-08
  • 打赏
  • 举报
回复
?

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧