DBH*_*BHC 1 c# fluent-nhibernate json.net
我无法序列化然后立即反序列化大对象而不会出现问题。我遵循以下建议: JSON.NET 和 nHibernate 集合延迟加载 和 JSON.Net NHibernate 代理序列化 (NH 3.3.2.4000),以使 Json.Net 与我的遗留系统一起工作。尽管尝试了这些建议并进行了各种组合,但我没有成功。以下是我理解的对我来说最有意义的设置。
转换器:
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
if (typeof(INHibernateProxy).IsAssignableFrom(objectType))
{
return base.GetSerializableMembers(objectType.BaseType);
}
else
{
return base.GetSerializableMembers(objectType);
}
}
Run Code Online (Sandbox Code Playgroud)
主要代码:
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new NHibernateContractResolver(),
PreserveReferencesHandling = PreserveReferencesHandling.All,
TypeNameHandling = TypeNameHandling.Auto,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ObjectCreationHandling = ObjectCreationHandling.Replace
};
string serialisedEnquiry = JsonConvert.SerializeObject(enquiry, Formatting.Indented, jsonSerializerSettings);
Enquiry enq = JsonConvert.DeserializeObject<Enquiry>(serialisedEnquiry, jsonSerializerSettings);
Run Code Online (Sandbox Code Playgroud)
我还有另一个开放的问题,可能值得注意:JSON.net null property 尽管正如您将在最后一条评论中看到的那样,我相信我已经解决了它。我只是在等待解决这个问题,以确认另一个问题已修复,而不是简单地被这个新错误埋葬/替换。
流畅的 NHibernate 1.4.0.0
NHibernate 3.3.1.4000
Netwonsoft.Json 6.0.0.0
编辑:
我的例外是:
Newtonsoft.Json.dll 中发生“NHibernate.LazyInitializationException”类型的未处理异常
附加信息:Initializing[Unavailable#] - 无法延迟初始化集合,没有会话或会话被关闭
我实际上发现它隐藏在我的 JSON 中:
$类型:“NHibernate.Collection.Generic.PersistentGenericBag`1[[ComponentModel.Role,ComponentModel]],NHibernate”
我不知道为什么当我有 NHibernate 转换器时,但它给了我一个可以研究的线索。如果我发现任何东西,我会回复。
我从来没有确切地发现出了什么问题,但当我玩它时我遇到了这个配置并且它起作用了。
jsonSerializerSettings = new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ContractResolver = new NHibernateContractResolver(),
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.Objects,
//TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple,
ObjectCreationHandling = ObjectCreationHandling.Replace
};
Run Code Online (Sandbox Code Playgroud)
NHibernateContractResolver 类:
public class NHibernateContractResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
if (typeof(INHibernateProxy).IsAssignableFrom(objectType))
return base.CreateContract(objectType.BaseType);
else
return base.CreateContract(objectType);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1587 次 |
| 最近记录: |