关于NHibernate的IList的反序列化

NHibernate返回IList结果集是常有的事,但在webservice一类的交互中,IList结果集无法序列化为xml字符串返回给客户端,除非你指定所有可能的类型

Code
如果我们试图一个方法返回多种类型的集合,上面的做法就很不合适了。也有人使用字节数组来返回结果集,下面的方法能将结果集或类序列化为字节数组
Code
不过,结果集的包含的子类必须指定为可序列化的
[Serializable]
public class Product
{....

 

我还是倾向于XML序列化,被序列化的类不需要什么特别声明,当然更重要的是几乎所有的开发语言都能处理XML。于是我尝试寻找将结果集转为XML的方法。

通过测试我知道,泛型的IList<T>是可以进行XML序列化。在NHibernate1.2版本已支持泛型了,同时,返回IList<T>比返回IList更为清晰,但webservcie是不能定义泛型接口的

Code
上面的定义能通过编译,但运行时会出错。我希望能以下面的方式来定义webservcie方法
Code
那么问题就变成,上面的字符参数pEntityName,如何变成泛型T,并调用以下查询类的SelectAll<T>方法
Code
webservcie接口
[WebMethod]
public string GetEntityList(string pEntityName,string pOrder,bool pIsAdc)
{
    
//构造查询的类。含有一个SelectAll的泛型方法
    Locator loc = new Locator();  
    
//取出方法
    Type typLoc = loc.GetType();
    MethodInfo mi 
= typLoc.GetMethod("SelectAll");
    
//泛型参数
    string strType = string.Format("{0}.{1},{0}""NH.Entity", pEntityName);
    Type typEntity 
= Type.GetType(strType);
    MethodInfo miConstructed 
= mi.MakeGenericMethod(typEntity);
    
//其他参数
    object[] args = { pOrder, pIsAdc };
    
//查询得到IList<T>
    object prds = miConstructed.Invoke(loc, args);
    
//XML序列化IList<T>
    return OperatorLib.XmlSeriTool.Serialize(prds);
}

OperatorLib.XmlSeriTool是自定义的一个XML序列化工具类,以下是上面使用到的一个静态方法
Code

posted @ 2008-12-16 11:34  生命体验之kevin-Y  阅读(1951)  评论(0)    收藏  举报