c# WebService soap 序列化. webservice 自定义类参数序列化的问题.

smallbyte 2011-11-23 11:44:15
Webservice 接口 如下:
[WebMethod]
public void SetCacheValue(string key, object value)
{
Cache.Insert(key,value);
}

在客户端有如下的调用:
WebserviceInterface.ClassName i = new WebserviceInterface.ClassName();
ClassEntityA entityA = new ClassEntityA();
entityA.strA = "a";
ClassEntityB entityB = new ClassEntityB();
entityB .intA = 205;
ClassEntityC entityC = new ClassEntityC();
entityC .floatA = 1.25;
i.SetCacheValue("key1",entityA);
i.SetCacheValue("key2",entityB);
i.SetCacheValue("key3",entityC);

public class ClassEntityA()
{
public string strA ;
}
public class ClassEntityB()
{
public int intA;
}
public class ClassEntityC()
{
public float floatA;
}
怎么在保证调用同一个webservice的接口时,序列化自定义类参数呀.
大伙帮帮忙呀!
...全文
623 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝_爸 2011-11-23
  • 打赏
  • 举报
回复
服务器也要定义ClassEntityA,ClassEntityB和ClassEntityC的
jerryfangsh 2011-11-23
  • 打赏
  • 举报
回复
ClassEntryA,B,C全都是客户端定义的。无法传到服务器端。
宝_爸 2011-11-23
  • 打赏
  • 举报
回复
可以试一试使用WCF的DataContract.

ClassEntityA,ClassEntityB和ClassEntityC的就继承自一个基类BaseClass
然后 用KnownType

[DataContract]
[KnownType(typeof(ClassEntityA ))
[KnownType(typeof(ClassEntityB ))
[KnownType(typeof(ClassEntityC ))
class BaseClass
{
}
[DataContract]
class ClassEntityA : BaseClass
{..}
[DataContract]
class ClassEntityB : BaseClass
{..}
[DataContract]
class ClassEntityC : BaseClass
{..}

然后函数声明的时候就可以使用基类了

public void SetCacheValue(string key, BaseClass value)


以上代码没有经过编译及测试,可能有些许错误。
宝_爸 2011-11-23
  • 打赏
  • 举报
回复
KnownType应该没法加在方法上

[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Struct, Inherited = true,
AllowMultiple = true)]
public sealed class KnownTypeAttribute : Attribute
jerryfangsh 2011-11-23
  • 打赏
  • 举报
回复
每个传输类型都要加上
smallbyte 2011-11-23
  • 打赏
  • 举报
回复
在Webservice的方法上?
Webservice的方法上的object value参数,可以是接受的客户端的 ClassEntityA 或者是 ClassEntityB 或者是 ClassEntityC
那怎么办???????
jerryfangsh 2011-11-23
  • 打赏
  • 举报
回复
在Web方法上声明特性:

KnownTypeAttribute

[KnownType(typeof(ClassEntityA))]

依次类推
smallbyte 2011-11-23
  • 打赏
  • 举报
回复
求关注呀,求围观呀!
smallbyte 2011-11-23
  • 打赏
  • 举报
回复
ClassEntityA,ClassEntityB和ClassEntityC 都在 TGS.Data 名称空间下.
服务端也引用了这个命名空间!
我的Webservice也创建在同一样项目内!
smallbyte 2011-11-23
  • 打赏
  • 举报
回复
不应为数据协定名称为“D_Config_GlobleConfig:http://schemas.datacontract.org/2004/07/TGS.Data”的类型“TGS.Data.D_Config_GlobleConfig”。
请考虑使用 DataContractResolver,或将任何未知类型以静态方式添加到已知类型的列表。例如,可以使用 KnownTypeAttribute 特性,或者将未知类型添加到传递给 DataContractSerializer 的已知类型列表。



出现这样的而错误是什么原因呀?

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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