Webservice 方法返回对象的问题

xiaozhimin1978 2008-04-11 03:16:16
定义了一个类和一个 Webservice 方法,Webservice 方法返回这个类的实例:


[Serializable]
public class LockerUser {
private int userid = -1;

public int UserID {
get {
return userid;
}
}

private string username = "";
public string UserName {
get {
return username;
}
}

public LockerUser() {
}

public LockerUser(int userid, string username) {
this.userid = userid;
this.username = username;
}
}



Webservice 方法如下:

[WebMethod]
public LockerUser TryLock(int userid, int orderformid) {
lock (locked) {
// 如果已经被其它用户锁定,则返回锁定该单的用户信息
LockerUser otherLockerUser = this.GetLockerInfo(orderformid);
if (otherLockerUser != null)
return otherLockerUser;

Entities.UserInfo.User user = Entities.UserInfo.User.GetByID(userid);
if (user == null || user.IsDisable)
return null;

List<int> formids = null;
locked.TryGetValue(userid, out formids);
if (formids == null) {
formids = new List<int>();
locked.Add(userid, formids);
}

if (!formids.Contains(orderformid))
formids.Add(orderformid);

return new LockerUser(user);
}
}




但是在 Webservice 客户端调用时,返回的 UserInfo 对象却无法访问我定义的这两个属性(UserInfo.UserID, UserInfo.UserName)。

怎么回事?
...全文
2536 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fh6880374 2010-11-19
  • 打赏
  • 举报
回复
我也遇到了相同的问题来看看
平庸人生 2010-05-14
  • 打赏
  • 举报
回复
我也遇到了相同的问题来看看
xiaozhimin1978 2008-04-15
  • 打赏
  • 举报
回复
搞定结帖
kingthy 2008-04-14
  • 打赏
  • 举报
回复
你的UserId与UserName属性没有set方法,而对象序列化是调用无参数的构造函数处理的.也就是你的这个构造函数

public LockerUser(int userid, string username) {
this.userid = userid;
this.username = username;
}


在客户端时(还原时)是不会被调用到的,也即userid与username都无法实例化了!!所以你在那两个属性里添加上set方法即可解决.
xiaozhimin1978 2008-04-14
  • 打赏
  • 举报
回复
楼上老兄,我的那个类本来就是可序列化的

并且问题不出在 WebService 端,而是在客户端

在客户端代码不能访问 Webservice 返回对象的自定义属性



localhost.OrderFormLocker remote = new localhost.OrderFormLocker();
localhost.LockerUser user = remote.TryLock(1, 1);
Console.WriteLine(user.UserID); // 编译时提示 UserID 不是LockerUser 的成员
Console.WriteLine(user.UserName); // 编译时提示 UserName 不是 LockerUser 的成员

changjiangzhibin 2008-04-14
  • 打赏
  • 举报
回复

//WebService返回的对象必须是可序列化的,LZ可考虑使用泛型
[WebMethod]
public List<LockerUser> TryLock(int userid, int orderformid)
{
List<LockerUser> listUser = new List<lockerUser>;
lock (locked) {
// 如果已经被其它用户锁定,则返回锁定该单的用户信息
LockerUser otherLockerUser = this.GetLockerInfo(orderformid);
if (otherLockerUser != null)
{
listUser.Add(otherLockerUser);
return listUser;
}

Entities.UserInfo.User user = Entities.UserInfo.User.GetByID(userid);
if (user == null || user.IsDisable)
return null;

List<int> formids = null;
locked.TryGetValue(userid, out formids);
if (formids == null) {
formids = new List<int>();
locked.Add(userid, formids);
}

if (!formids.Contains(orderformid))
formids.Add(orderformid);

listUser.Add(new LockerUser(user));
return listUser;
}
}
kbryant 2008-04-14
  • 打赏
  • 举报
回复
友情up
xiaozhimin1978 2008-04-14
  • 打赏
  • 举报
回复
楼上的办法不是太好

我记得在java中是可以传接口的,不会在 C# 中不行吧
badtank 2008-04-11
  • 打赏
  • 举报
回复
/////////////////////////////////////Webservice:////////////////////////////////////
using System;
.................
using HumanResource;
namespace ServiceTest
{
public class MyService : System.Web.Services.WebService
{
public MyService()
{
.........
}
...............
//方法
[WebMethod]
public string GetEmployee( )
{
Employee m_emp = new Employee();
return Serializer.Serialize(m_emp);
}
}
}

在访问webservice的一端,先将返回的序列化之后的对象反序列化为实体类后再来使用。
using HumanResource;
namespace ServiceClientTest
{
public class MyServiceClient
{
public MyServiceClient()
{
.........
}
...............
//方法

public Employee GetEmployee( )
{
string strm_emp = service.GetEmployee( );
return Serializer.DeSerialize(m_emp) as Employee;
}
}
}
客户端程序(可能也是个web程序)通过调用MyServiceClient的方法来访问WebService.
二进制序列化反序列化的方法:
public static string Serialize(object obj)
{
string serializedObject = null;
if (obj != null)
{
IFormatter formatter = new BinaryFormatter();
using (Stream stream = new MemoryStream())
{
formatter.Serialize(stream, obj);
long count = stream.Length;
byte[] buff = new byte[count];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(buff, 0, Convert.ToInt32(count));
stream.Close();
serializedObject = Convert.ToBase64String(buff);
}
}
return serializedObject;
}

public static object DeSerialize(string serializedObject)
{
object @object = null;
if (serializedObject!="")
{
IFormatter fter = new BinaryFormatter();
byte[] buff = Convert.FromBase64String(serializedObject);
using (Stream stream = new MemoryStream(buff))
{
@object = fter.Deserialize(stream);
stream.Close();
}
}
return @object;
}
搬了一下刚才在另外一个问题中的回复,希望对你的问题有帮助. :)

12,162

社区成员

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

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