云计算 频道

WCF与Hprose的Azure云端对决

  数据类型支持

  在类型支持上WCF和Hprose各有千秋。对于基本类型、简单类型、简单对象,WCF和Hprose都提供支持。

  但是对于DataSet这样的.NET特有类型,则WCF支持,Hprose不支持,因为DataSet在非.NET语言环境下无法使用。

  而对于复杂的带有直接或间接自引用的对象数据,Hprose支持,而WCF不支持。例如下列类型:

  

public enum Sex {

  Unknown, Male, Female, InterSex

  }

  [Serializable]

  
public class User {

  
string name;

  
int age;

  DateTime birthday;

  Sex sex;

  bool married;

  List friends;

  
public string Name {

  
get {

  return name;

  }

  
set {

  name
= value;

  }

  }

  
public int Age {

  
get {

  return age;

  }

  
set {

  age
= value;

  }

  }

  
public DateTime Birthday {

  
get {

  return birthday;

  }

  
set {

  birthday
= value;

  }

  }

  
public bool Married {

  
get {

  return married;

  }

  
set {

  married
= value;

  }

  }

  
public Sex Sex {

  
get {

  return sex;

  }

  
set {

  sex
= value;

  }

  }

  
public List Friends {

  
get {

  return friends;

  }

  
set {

  friends
= value;

  }

  }

  }

  当服务方法为:

  
public List GetUsers() {

  User user
= new User();

  user.Name
= "张三";

  user.Age
= 30;

  user.Birthday
= new DateTime(1980, 12, 1);

  user.Sex
= Sex.Male;

  user.Married
= true;

  User user2
= new User();

  user2.Name
= "李四";

  user2.Age
= 28;

  user2.Birthday
= new DateTime(1982, 2, 18);

  user2.Sex
= Sex.Male;

  user2.Married
= false;

  User user3
= new User();

  user3.Name
= "王五";

  user3.Age
= 38;

  user3.Birthday
= new DateTime(1972, 6, 14);

  user3.Sex
= Sex.Male;

  user3.Married
= true;

  User user4
= new User();

  user4.Name
= "赵六";

  user4.Age
= 1;

  user4.Birthday
= new DateTime(2008, 11, 23);

  user4.Sex
= Sex.Male;

  user4.Married
= false;

  
// 以下注释掉的代码 WCF 不支持,但 Hprose 支持

  
/*

  user.Friends
= new List();

  user.Friends.Add(user2);

  user.Friends.Add(user4);

  user2.Friends
= new List();

  user2.Friends.Add(user);

  user2.Friends.Add(user3);

  user3.Friends
= new List();

  user3.Friends.Add(user2);

  user4.Friends
= new List();

  user4.Friends.Add(user);

  
*/

  List users
= new List();

  users.Add(user);

  users.Add(user2);

  users.Add(user3);

  users.Add(user4);

  return users;

  }

  

如果将上面注释掉的代码取消注释,则Hprose可以正确发布该服务,并且所有语言的Hprose客户端都可以正常调用。但如果用WCF来发布它,在用WCF客户端调用时,服务会崩溃。

  因此如果发布的服务仅限于.NET平台,又非常喜欢传输数据集,而且不会传输复杂对象的话,那么WCF是个不错的选择。而如果您发布的服务是跨语言跨平台的,而且会传输复杂对象(复杂对象在游戏中非常多见)的话,则Hprose将是首先。

0
相关文章