把NHibernate的DomainObject转换为Json!?

摘要:
因为Asp-Net内置到Json的转换不能仅转换Get属性,并且对象需要默认的无参数构造函数。WebService中报告了如下错误:System。无效操作异常:无法生成临时类。errorCS0272:属性索引器“Test.User.LoginId'不能在此上下文中使用,因为setaccessible只能以两种方式使用:1)将DTO应用于Json转换。缺点是很麻烦。无用的代码会增加。此外,使用大量理论打开hibernateinAction,并始终警告DTO是多余的……2)污染DomainObject,所有这些都已设置并获取。后来,Google一次又一次地看到老赵的博客,描述了如何使用JavascriptConver进行转换。以下是我编写的NHibernate代码的转换代码。
     这几天一直在做个Demo,把NHibernate、Ajax.net、WebService 整合在一起。但是到了转换Json的时候就开始郁闷。翻遍了陈先生的第二卷都找不到答案(因为答案在第三卷~)。

     因为Asp.net内置的转Json不能够转换只有Get的属性,而且对象需要默认无参构造函数。在WebService一直报个错误
如下:

System.InvalidOperationException: Unable to generate a temporary class (result=1).
error CS0272: The property or indexer "Test.User.LoginId' cannot be used in this context because the set accessor is inaccessible

    遇到这样的情况就只有两种方法
    1)适用DTO做Json转换。好处是可以直接转换JSON。缺点是,烦,没有用的代码会成培增加,而且翻开理论多多的hibernate in Action,一直告诫DTO是多余的,多余的.......。
    2) 污染DomainObject,全部都有set和get。哈哈,那么在注释上面就要好好地写着“请不要使用本属性的set方法”。而且处理双向关联还是需要人工调整。
    看来两个都是没有好处。
     后来google了一次又一次,看了老赵的blog,介绍怎样用 JavascriptConvter 做转换。试着做一个,还真的运行称成功,虽然无法处理双向关联和index的属性,但是对于我已经很够用啦。
     如果又那位高人想到更好的办法,望不惜赐教。

下面是我写的代码NHibernate的转换代码。
把NHibernate的DomainObject转换为Json!?第1张using System;
把NHibernate的DomainObject转换为Json!?第1张
using System.Collections;
把NHibernate的DomainObject转换为Json!?第1张
using System.Collections.Generic;
把NHibernate的DomainObject转换为Json!?第1张
using System.Reflection;
把NHibernate的DomainObject转换为Json!?第1张
using System.Web.Script.Serialization;
把NHibernate的DomainObject转换为Json!?第1张
using NHibernate;
把NHibernate的DomainObject转换为Json!?第1张
using NHibernate.Burrow;
把NHibernate的DomainObject转换为Json!?第1张
using NHibernate.Persister.Entity;
把NHibernate的DomainObject转换为Json!?第1张
using NHibernate.Proxy.Poco.Castle;
把NHibernate的DomainObject转换为Json!?第1张
把NHibernate的DomainObject转换为Json!?第1张
namespace TestWeb.Json
把NHibernate的DomainObject转换为Json!?第12张把NHibernate的DomainObject转换为Json!?第13张
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张    
public class NHibernateConverter : JavaScriptConverter
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张    
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张        
private const BindingFlags getProperty = BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance;
把NHibernate的DomainObject转换为Json!?第15张        
private const BindingFlags setProperty = BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty;
把NHibernate的DomainObject转换为Json!?第15张        
public Dictionary<Type, string> idBag = new Dictionary<Type, string>();
把NHibernate的DomainObject转换为Json!?第15张        
private IList<Type> supportedTypes;
把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
public NHibernateConverter()
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
public override IEnumerable<Type> SupportedTypes
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张            
get
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                
if (supportedTypes == null)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    BurrowFramework bf 
= new BurrowFramework();
把NHibernate的DomainObject转换为Json!?第15张                    ISessionFactory s 
= bf.GetSession().SessionFactory;
把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张                    supportedTypes 
= new List<Type>();
把NHibernate的DomainObject转换为Json!?第15张                    
//supportedTypes.Add(typeof(User));
把NHibernate的DomainObject转换为Json!?第15张
                    IDictionary classf = s.GetAllClassMetadata();
把NHibernate的DomainObject转换为Json!?第15张                    
foreach (Type o in classf.Keys)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                    
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                        AbstractEntityPersister cla 
= (AbstractEntityPersister) classf[o];
把NHibernate的DomainObject转换为Json!?第15张                        supportedTypes.Add(o);
把NHibernate的DomainObject转换为Json!?第15张                        idBag.Add(o, cla.IdentifierPropertyName);
把NHibernate的DomainObject转换为Json!?第28张                    }

把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第15张                
return supportedTypes;
把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
public override object Deserialize(IDictionary<stringobject> dictionary, Type type,
把NHibernate的DomainObject转换为Json!?第15张                                           JavaScriptSerializer serializer)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张            
//只是对Public的并且又Set的方法赋值。
把NHibernate的DomainObject转换为Json!?第15张
            BurrowFramework bf = new BurrowFramework();
把NHibernate的DomainObject转换为Json!?第15张            
object id = dictionary[idBag[type]];
把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张            
object result = bf.GetSession(type).Get(type, id);
把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张            
foreach (PropertyInfo info in type.GetProperties(setProperty))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                
if (dictionary.ContainsKey(info.Name))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    
object value = dictionary[info.Name];
把NHibernate的DomainObject转换为Json!?第15张                    info.SetValue(result, value, 
null);
把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第15张            
return result;
把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
public override IDictionary<stringobject> Serialize(object obj, JavaScriptSerializer serializer)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张            BurrowFramework bf 
= new BurrowFramework();
把NHibernate的DomainObject转换为Json!?第15张            
//从缓冲中删除。哪么在设定过程中就不会触发LazyLoad。
把NHibernate的DomainObject转换为Json!?第15张
            bf.GetSession().Evict(obj);
把NHibernate的DomainObject转换为Json!?第15张            
//已经处理过一次的对象。
把NHibernate的DomainObject转换为Json!?第15张
            ArrayList hadConverObjects = new ArrayList();
把NHibernate的DomainObject转换为Json!?第15张            hadConverObjects.Add(obj);
把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张            Dictionary
<stringobject> result = new Dictionary<stringobject>();
把NHibernate的DomainObject转换为Json!?第15张            CreateResult(result, obj, hadConverObjects);
把NHibernate的DomainObject转换为Json!?第15张            
return result;
把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
private void CreateResult(Dictionary<stringobject> result, object obj, IList hadConverObjects)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张            Type type 
= obj.GetType();
把NHibernate的DomainObject转换为Json!?第15张            
foreach (PropertyInfo proertyInfo in type.GetProperties(getProperty))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                
object value;
把NHibernate的DomainObject转换为Json!?第15张                
//HibernateLazyInitializer是懒加载对象独有属性。
把NHibernate的DomainObject转换为Json!?第15张
                if ("HibernateLazyInitializer" != proertyInfo.Name &&
把NHibernate的DomainObject转换为Json!?第15张                    GetObject(proertyInfo, obj, hadConverObjects, 
out value))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    
if (!result.ContainsKey(proertyInfo.Name))
把NHibernate的DomainObject转换为Json!?第15张                        result.Add(proertyInfo.Name, value);
把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
private bool GetObject(PropertyInfo propertyInfo, Object obj, IList hadConverObjects, out object value)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张            PropertyInfo info 
= obj.GetType().GetProperty("HibernateLazyInitializer");
把NHibernate的DomainObject转换为Json!?第15张            value 
= null;
把NHibernate的DomainObject转换为Json!?第15张            
if (info != null)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                CastleLazyInitializer lazyObject 
= (CastleLazyInitializer) info.GetValue(obj, null);
把NHibernate的DomainObject转换为Json!?第15张                
//这个lazyLoad属性并没有初始化。
把NHibernate的DomainObject转换为Json!?第15张
                if (lazyObject.IsUninitialized)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    
return false;
把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张            
if (IsValueType(propertyInfo.PropertyType))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                value 
= propertyInfo.GetValue(obj, null);
把NHibernate的DomainObject转换为Json!?第15张                
return true;
把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第15张            
else
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                value 
= null;
把NHibernate的DomainObject转换为Json!?第15张                
//不知道怎样处理Index属性。???
把NHibernate的DomainObject转换为Json!?第15张
                if (propertyInfo.GetIndexParameters().Length != 0)
把NHibernate的DomainObject转换为Json!?第15张                    
return false;
把NHibernate的DomainObject转换为Json!?第15张                
把NHibernate的DomainObject转换为Json!?第15张                
if (supportedTypes.Contains(propertyInfo.PropertyType))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    value 
= propertyInfo.GetValue(obj, null);
把NHibernate的DomainObject转换为Json!?第15张                    
//如果已经处理过就不再处理,跳过。
把NHibernate的DomainObject转换为Json!?第15张
                    if (hadConverObjects.Contains(value))
把NHibernate的DomainObject转换为Json!?第15张                        
return false;
把NHibernate的DomainObject转换为Json!?第15张                    
else
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                    
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                        hadConverObjects.Add(value);
把NHibernate的DomainObject转换为Json!?第15张                        
return true;
把NHibernate的DomainObject转换为Json!?第28张                    }

把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第15张                
else if (IsCollectionWithNHibernateObject(propertyInfo.PropertyType))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    value 
= propertyInfo.GetValue(obj, null);
把NHibernate的DomainObject转换为Json!?第15张                    
return true;
把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张                
return false;
把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
private static bool IsValueType(Type t)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张            
if (t == typeof (ValueType) || t == typeof (string))
把NHibernate的DomainObject转换为Json!?第15张                
return true;
把NHibernate的DomainObject转换为Json!?第15张            
else
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                
if (t.BaseType != null)
把NHibernate的DomainObject转换为Json!?第15张                    
return IsValueType(t.BaseType);
把NHibernate的DomainObject转换为Json!?第15张                
else return false;
把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第15张
把NHibernate的DomainObject转换为Json!?第15张        
private bool IsCollectionWithNHibernateObject(Type t)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张        
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张            
if (t == typeof (IEnumerable))
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                
foreach (Type type in t.GetGenericArguments())
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    
return supportedTypes.Contains(type);
把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第15张                
return false;
把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第15张            
else
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张            
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                
if (t.BaseType != null)
把NHibernate的DomainObject转换为Json!?第16张把NHibernate的DomainObject转换为Json!?第17张                
把NHibernate的DomainObject转换为Json!?第14张{
把NHibernate的DomainObject转换为Json!?第15张                    
return IsCollectionWithNHibernateObject(t.BaseType);
把NHibernate的DomainObject转换为Json!?第28张                }

把NHibernate的DomainObject转换为Json!?第15张                
else
把NHibernate的DomainObject转换为Json!?第15张                    
return false;
把NHibernate的DomainObject转换为Json!?第28张            }

把NHibernate的DomainObject转换为Json!?第28张        }

把NHibernate的DomainObject转换为Json!?第28张    }

把NHibernate的DomainObject转换为Json!?第237张}


最好,按照老赵的方法添加到Web.config就可以了
老赵的教程:http://www.cnblogs.com/JeffreyZhao/archive/2006/11/13/Inside_Atlas_Series__Web_Services_Access_in_Atlas__Sample_7.html

免责声明:文章转载自《把NHibernate的DomainObject转换为Json!?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇哈尔滨工业大学计算机学院-自然语言处理-课程总结Dockerfile执行shell脚本报错No such file or directory(又名 Dockerfile中sh脚本格式引发的灾难)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Hibernate用Mysql数据库时链接关闭异常的解决

在一个项目中,客户要求除操作系统外全部使用免费软件,因此我使用了Mysql 4.0作为数据库服务器,其JDBC驱动为3.0.9版本,在给客户安装后调试一切正常。可是到了第二天,只要一登录就提示“No operations allowed after connection closed”异常,显示在浏览器上。在经过一番检查后我发现,在这种情况下只要重新启动T...

一个NHibernate的BUG

一、背景 我们如今做的项目,用NHibernate实现数据訪问层。 訪问数据时,有的数据库表是确定的:有明白的表名、字段名。这时候依照常规的方法处理就可以:建立数据库表到类的映射。使用HQL读写数据库。 但有的数据訪问,所针对的数据库表是不确定的,在执行阶段确定訪问哪些数据库表的哪些字段。 数据库表和字段都不确定,自然没办法建议O-R映射,仅仅好构造SQ...

Hibernate实体对象状态和操作

一、Hibernate对象的状态 瞬态(Transient):当一个对象通过new 操作符创建,并且没有和Hibernate的session关联过,就处于瞬态。瞬态的对象在数据库里没有相应的记录和标识符,和普通Object没有区别。 持久化(Persistent):持久化的实例在数据库有对应的记录和标识符,并且在session的范围内,任何对实例的改动都...

Hibernate的查询语言之HQL(一)——快速入门

  Hibernate提供异常强大的查询体系,使用Hibernat有多种查询方式可以选择:即可以使用Hibernate的HQL查询,也可以使用条件查询,甚至可以使用原生的SQL查询语句。不仅如此, Hibernate还提供了一种数据过滤功能,这些都用于筛选目标数据。   Hibernate是 Hibernate Query Language的缩写,HQL的...

MiniDao (轻量级JAVA持久层,Hibernate完美助手)

MiniDao (轻量级JAVA持久层,Hibernate完美助手) 当前最新版本: 1.6.2 (发布日期:20180309) MiniDao产生的初衷? 采用Hibernate的J2EE项目都有一个痛病,针对复杂业务SQL,hibernate能力不足,SQL不好优化也无法分离。 这个时候大家就想到集成mybatis,但是一个项目既用hibernate又...

Hibernate的批量处理

  Hibernate完全以面向对象的方式操作数据库,当程序员以面向对象的方式操作持久化对象时,将自动转换为对数据的操作。例如我们Session的delete()方法,来删除持久化对象,Hibernate将负责删除对应的数据记录;当我们执行持久化对象的setter方法时,Hibernate将自动转换为底层的update语句,修改数据库的对应记录。   问题...