从很久以前开始,但我认为这里的问题实际上是代理在尝试序列化之前没有初始化。
您必须调用NHibernateUtil.Initialize(aPersistentObject.LazyProperty);
以初始化代理对象。
之后,BaseType
可能是正确的......即不是ProxyDummy
,而是需要的实际类型。
对我来说,解决方案是这样的:
namespace com.example.DataAccess
{
public static class Helper
{
// the implementation I use creates a ThreadStatic ISession,
// and then orphans and disposes that ISession when the
// result of this method is disposed.
public static IDisposable GetSession();
public static Type GetUnproxiedType(Type objectType)
{
if (typeof(INhibernateProxy).IsAssignableFrom(objectType))
return objectType.BaseType;
return objectType;
}
public static void Initialize(object proxy)
{
NHibernateUtil.Initialize(proxy);
}
}
}
namespace com.example.WebService
{
internal static class Helper
{
private class ProxyResolver : CamelCasePropertyNamesContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
return base.CreateContract(DataAccess.Helper.GetUnproxiedType(objectType));
}
}
public static readonly JsonSerializer serializer = new JsonSerializer
{
ContractResolver = new ProxyResolver(),
Converters =
{
new StringEnumConverter(),
},
DateFormatHandling = Newtonsoft.Json.DateFormatHandling.IsoDateFormat,
Formatting = Formatting.Indented,
// etc.
};
}
}
所以当我有一个代理类型的 REST 服务端点时,它看起来像这样:
[WebGet(UriTemplate= "foo/{id}/bar")]
public Bar GetFooBar(string id)
{
using (DataAccess.Helper.GetSession())
{
var foo = GetFoo(id);
if (foo == null) return null;
DataAccess.Helper.Initialize(foo.Bar);
return foo.Bar;
}
}
中定义的序列化WebService.Helper
器用于对结果进行序列化。
请注意,如果序列化过程发生在您的方法之外(就像对我一样),您将始终需要在实际序列化对象之前调用以初始化对象。您也许可以使用Global.asax
事件来做到这一点,但我只是直接在我的服务方法中处理它。