数据类型支持
在类型支持上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;
}
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将是首先。