NHibernate 代理的 JSON.Net 序列化 (NH 3.3.2.4000)

2023-11-24

I'm still让 Json.Net 和 NHibernate 很好地协同工作一直存在困难。即,让 Json.NET 序列化代理的 NHibernate 对象。

我已遵循建议here,无论是已接受的答案还是修正案,但没有骰子。

上述解决方案的最大问题是 NHibernate 的现代版本似乎正在使用INHibernateProxyProxy创建代理的接口(而不是 IN HibernateProxy?其他人可以确认这一点吗?),在我的例子中,其基类是NHibernate.Proxy.DynamicProxy.ProxyDummy,当我尝试使用自定义合约解析器创建 Json 构造时,它不会透露任何有关底层对象的信息,即:

    protected override JsonContract CreateContract(Type objectType)
    {
        if (typeof(NHibernate.Proxy.INHibernateProxy).IsAssignableFrom(objectType))
            return base.CreateContract(objectType.BaseType);
        else
            return base.CreateContract(objectType);
    }

有谁对如何处理有任何建议INHibernateProxyProxy有效地?


完整的解决方案:

在 Global.asax.cs 中:

 //Define Formatters
        var formatters = GlobalConfiguration.Configuration.Formatters;
        var jsonFormatter = formatters.JsonFormatter;
        var settings = jsonFormatter.SerializerSettings;
        settings.Formatting = Formatting.Indented;           
        jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
        jsonFormatter.SerializerSettings.PreserveReferencesHandling  = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        jsonFormatter.SerializerSettings.ContractResolver = new NHibernateContractResolver();
        //------------//

以及定制合同:

public class NHibernateContractResolver : DefaultContractResolver
{
    private static readonly MemberInfo[] NHibernateProxyInterfaceMembers = typeof(INHibernateProxy).GetMembers();

    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        var members = base.GetSerializableMembers(objectType);

        members.RemoveAll(memberInfo =>
                          (IsMemberPartOfNHibernateProxyInterface(memberInfo)) ||
                          (IsMemberDynamicProxyMixin(memberInfo)) ||
                          (IsMemberMarkedWithIgnoreAttribute(memberInfo, objectType)) ||
                          (IsMemberInheritedFromProxySuperclass(memberInfo, objectType)));

        var actualMemberInfos = new List<MemberInfo>();

        foreach (var memberInfo in members)
        {
            var infos = memberInfo.DeclaringType.BaseType.GetMember(memberInfo.Name);
            actualMemberInfos.Add(infos.Length == 0 ? memberInfo : infos[0]);
        }

        return actualMemberInfos;
    }

    private static bool IsMemberDynamicProxyMixin(MemberInfo memberInfo)
    {
        return memberInfo.Name == "__interceptors";
    }

    private static bool IsMemberInheritedFromProxySuperclass(MemberInfo memberInfo, Type objectType)
    {
        return memberInfo.DeclaringType.Assembly == typeof(INHibernateProxy).Assembly;
    }

    private static bool IsMemberMarkedWithIgnoreAttribute(MemberInfo memberInfo, Type objectType)
    {
        var infos = typeof(INHibernateProxy).IsAssignableFrom(objectType)
                      ? objectType.BaseType.GetMember(memberInfo.Name)
                      : objectType.GetMember(memberInfo.Name);

        return infos[0].GetCustomAttributes(typeof(JsonIgnoreAttribute), true).Length > 0;
    }

    private static bool IsMemberPartOfNHibernateProxyInterface(MemberInfo memberInfo)
    {
        return Array.Exists(NHibernateProxyInterfaceMembers, mi => memberInfo.Name == mi.Name);
    }


protected override JsonContract CreateContract(Type objectType)
{
    if (typeof(INHibernateProxy).IsAssignableFrom(objectType))
    {
        var oType = objectType.GetInterfaces().FirstOrDefault(i => i.FullName.StartsWith("Your.Domain.Namespace"));
        return oType != null ? base.CreateContract(oType) : base.CreateContract(objectType.BaseType);
    }
    return base.CreateContract(objectType);
}

不要忘记替换:“Your.Domain.Namespace”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 代理的 JSON.Net 序列化 (NH 3.3.2.4000) 的相关文章

  • 最好的 NHibernate 二级缓存提供程序是什么?

    我见过有很多这样的 NCache Velocity 等等 但我还没有找到比较它们的表格 考虑以下标准什么是最好的 容易明白 最近正在维护中 是免费的或者有足够好的免费版本 Works 我无法说出什么是最好的或最差的 但我会分享我使用 NCa
  • 如何知道 HTTP 服务器何时完成发送数据

    我正在开发一个面向浏览器 代理的项目 我需要下载网页 向 Web 服务器发送自定义 HTTP 请求后 我开始监听服务器响应 读取响应时 我检查响应标头中的 Content Length row 如果我得到其中之一 很容易确定服务器何时完成发
  • Json.Net:使用 SelectToken 在不知道元素名称的情况下获取值?

    我有一个简单的 JSON 文件 我需要获取令牌的值 我尝试使用 SelectToken 但问题是元素的名称是动态的 这是我的 JSON 文件 name testdata items myItemName located true 我需要获取
  • 如何告诉 NHibernate 始终强制引用标识符?

    正如标题 我如何一劳永逸地告诉NHibernate 所有表名和列名都将在它生成的SQL 中引用 您还可以尝试 SchemaMetadataUpdater QuoteTableAndColumns configuration
  • 代理阻止网络套接字?如何绕行

    我有一个用 Python 编写的正在运行的 websocket 服务器 来自https github com opiate SimpleWebSocketServer https github com opiate SimpleWebSoc
  • 通过代理从java发送电子邮件

    我使用 Java Mail API 来发送和接收电子邮件 现在我做这个项目的地方有一个代理服务器 我可以知道如何通过代理服务器从java发送电子邮件吗 请参阅此处的常见问题解答 http www oracle com technetwork
  • NHibernate Session.Flush & Evict 与 Clear

    在一个测试中 我想要持久化一个对象 然后通过从数据库 而不是会话 获取它来证明它是持久化的 我注意到以下内容没有区别 save it session Clear fetch it or save it session Flush sessi
  • PHP cURL 代理带标头?

    我正在制作一个 PHP 图像代理脚本 我需要它不仅能够回显其请求的图像的内容 而且还能够以相同的方式重现图像请求的标头 我见过一个 另一个 但没有同时看到过 这些 cURL 选项让我感到困惑 我该怎么做 抱歉 我不确定你想要什么 这是从图像
  • JsonConverter 不作为属性属性工作

    我有一个对象 其中包含具有 JsonConverter 属性的属性 对于数据读写 转换器不工作 声明的属性是 JsonConverter typeof EpochDateTimeConverter public DateTime Creat
  • NHibernate QueryOver SQLFunction in where 子句

    我想查询一个具有多行的表 每行都有一个timestamp数据每隔十分钟出现一次 我想找到任何丢失数据的开头 即没有timestamp等于接下来的十分钟间隔 如下所示 select a timestamp from table as a wh
  • 部署解耦的前端+后端应用程序

    我使用两个完全解耦的组件编写了一个网络应用程序 一个基于 Place Framework 并服务以下请求的 API 类型 api 任何客户 基于解耦的前端AngularJS建造使用grunt build 现在 前端与API但我希望这两个单元
  • 如何使用 Boost 在 C++ 中制作代理服务器 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在制作一个 Web 应用程序模糊
  • 将虚拟主机分配给 Docker 端口

    我设置了通配符 DNS 以便对自定义域 foo 的所有 Web 请求都映射到 Docker 主机的 IP 地址 如果我有多个运行 Apache 或 Nginx 实例的容器 每个容器都会将 Apache 端口 80 映射到某个外部入站端口 我
  • 使用 NGINX auth_request 和 oauth2_proxy 设置标头

    我想使用授权请求 http nginx org en docs http ngx http auth request module html and oauth2 proxy https github com bitly oauth2 pr
  • Gradle 从服务器收到状态代码 403:禁止

    由于这个错误 我无法构建我的 android 项目 Gradle 无法获取https www jitpack io com github Raizlabs DBFlow dbflow 3 1 1 dbflow 3 1 1 pom https
  • 使用 JSONPath 按名称过滤 json 属性

    我想选择属性名称中具有特定匹配项的所有元素 例如 此 json 中名称以 pass 开头的所有属性 firstName John lastName doe age 50 password 1234 phoneNumbers type iPh
  • NHibernate、Fluent NHibernate 和 Iesi.Collection 的问题。接下来你会尝试什么?

    我对 NHibernate 非常陌生 所以如果我在这里遗漏了一些琐碎的事情 我深表歉意 我目前正在阅读 packtpub 出版的一本名为 NHibernate 3 Beginners Guide 的书 我基本上都是按照书中的指示进行的 当我
  • NHibernate同时将两列作为复合键和外键

    首先 我在网上和这里进行了彻底的搜索 但没有找到解决手头任务的明确解决方案 如果我的搜索不够准确并且这个答案已经发布 我深表歉意 问题 我有一张桌子 该表必须在两个字段上有一个主键 并且其他字段包含一些数据 作为主键的两个字段也必须是外键
  • NHibernate、数据绑定到 DataGridView、延迟加载和会话管理 - 需要建议

    我的主应用程序窗体 WinForms 有一个 DataGridView 它使用 DataBinding 和 Fluent NHibernate 显示 SQLite 数据库中的数据 该表单在应用程序运行的整个过程中都是打开的 出于性能原因 我
  • 在 nHibernate 关系中使用实体的 Lite 版本?

    在某些情况下 出于性能原因 创建一个实体的轻量级版本 指向同一个表 但映射的列较少 这是一个好主意吗 例如 如果我有一个包含 50 列的联系人表 并且在一些相关实体中 我可能对 FirstName 和 LastName 属性感兴趣 那么创建

随机推荐

  • 强制 Visual Studio 在调试时始终“重建全部”

    编辑 基本上我需要的是 Visual Studio 在我进行调试时始终重建所有内容 我目前正在使用 Visual Studio 来编译我的汇编程序 使用 MASM 总的来说它工作正常 然而我遇到了一个恼人的问题 如果我包含一个像这样的文件
  • Google Chrome 扩展程序获取页面信息

    我正在制作一个 google chrome 扩展 我需要获取当前页面的 URL 和标题 我怎样才能实现这个目标 chrome tabs getSelected null function tab lt tab has all the inf
  • 如何使用 Iron Router 返回 404

    当我找到使用 IR 的 Meteor 应用程序中不存在的路线时 我会收到200带有 HTML 的响应 当在浏览器上呈现时 在控制台上显示 js 错误 说明No route found for path aRoute 怎样才能让它返回404
  • -[UIApplication _runWithMainScene:transitionContext:completion:] 中断言失败,

    我仅在 iOS9 中收到以下错误 这是我的代码 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOpti
  • 带有 UIViewController 的插件

    有人可以向我解释 Cordova iOS 插件的生命周期吗 特别是 我有一个正在尝试开发的插件 其中包含UIView 以及相关的UIViewController 我如何获得科尔多瓦UIView从我的扩展CDVPlugin类 这样我就可以将我
  • Java中获取二维数组的数组长度

    我需要获取行和列的二维数组的长度 我已经使用以下代码成功完成了此操作 public class MyClass public static void main String args int test test new int 5 10 i
  • 是否可以使用 HttpModule 删除一些发布数据?

    我正在将一个旧的经典 asp 网站转换为 asp net 该应用程序基本上是针对给定用户组的工具集的扩展 但它由外部供应商托管 为了执行到此应用程序的无缝传输 它会发布一些 xml 数据 该数据会触发 潜在危险的 Request Form
  • Linq-to-Sql SubmitChanges 不更新字段...为什么?

    我发布了这个question昨天晚上 这让我发现了一个huge问题 我的数据库中有一个名为 单位 的十进制列 每当我将该列的值设置为非零时 并且 SubmitChanges 列都会更新为新值 如果我尝试将该列的值设置为零 则 SubmitC
  • 如何fork JVM? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 类似 C 的 Fork 我想知道如何从 JDK 派生一个子 JVM 或者甚至可以这样做吗 一些框架 例如 hadoop 会为特定任务创建一个子 JVM 因此请对这个主题进行一些说明 Than
  • 如何使用 EPPLus 修改图表系列?

    我想问一下如何使用 EPPLUS 库更新 Excel 中现有图表的系列值 我还不知道该怎么做 我已经成功创建图表 但仍然无法更新系列值 任何人都可以给我提供一些示例代码或参考链接吗 抱歉这么晚才回答 在搜索其他内容时看到您的帖子 如果图表有
  • vscode "python.jediEnabled": false,显示为未知配置设置

    这是settings json文件代码 python autoComplete addBrackets true python linting enabled true python pythonPath C Program Files P
  • 一次一密,加密解密

    我正在尝试学习密码学并且一直在尝试这个练习 编写一个程序 最好是Java 生成一次性的pad 这是所有文件中比较大的一个 随机数据 例如 1 MB 该程序还应该能够根据以下内容加密 解密文件 生成一次性本 提示 使用以下测试向量来检查您的程
  • 使用 C# 将日期时间格式转换为 SQL 格式

    我正在尝试从 C 保存当前日期时间格式并将其转换为 SQL Server 日期格式 如下所示yyyy MM dd HH mm ss所以我可以用它来我的UPDATE query 这是我的第一个代码 DateTime myDateTime Da
  • 找不到 -lboost_system 的库

    我使用 macports 安装了 boost 这些文件似乎位于 opt local include boost 中 我的 makefile 不再工作并且出现以下错误 Undefined symbols boost system generi
  • 在 C# 中以编程方式设置 dllimport

    我在用DllImport在我的解决方案中 我的问题是我有同一个 DLL 的两个版本 一个是为 32 位构建的 另一个是为 64 位构建的 它们都公开具有相同名称和相同签名的相同函数 我的问题是我必须使用两个静态方法来公开这些方法 然后在运行
  • 如何使用 ember-rails 启用 query-params-new 功能

    我在使用 query params new 功能时遇到问题 我的 ember 版本是 1 4 0 beta 2 Ember js 通过 ember rails 和 ember source gems 加载到我的 Rails 应用程序中 在初
  • 从模板(视图)中动态加载 AngularJS 模块

    背景 为了便于讨论 我们假设您有 100 000 次观看 部分观看 我们还假设您有附带的视图范围控制器 以及潜在的视图范围服务和过滤器 尝试设想一个托管 100 000 个不同小型应用程序的聚合应用程序 Issue 当您有需要附带控制器的
  • ASP.NET MVC 忽略所有 url 末尾的“.html”

    我是 ASP NET MVC 新手 现在正在努力解决 url 路由问题 我正在使用 asp net mvc 3 RC2 如何创建一个 url 路由IGNORESurl 中最末尾的扩展名 扩展名可以是 html aspx php anythi
  • 如何实现类似于 jQuery UI 自动完成的 Dojo 自动完成?

    美好的一天 我使用 JSP 和 jQuery UI 成功实现了文本输入的自动完成功能 自动完成数据从数据库中检索并通过服务器端的 q 参数进行过滤 它返回包含查询字符串的所有项目 SELECT name FROM organization
  • NHibernate 代理的 JSON.Net 序列化 (NH 3.3.2.4000)

    I m still让 Json Net 和 NHibernate 很好地协同工作一直存在困难 即 让 Json NET 序列化代理的 NHibernate 对象 我已遵循建议here 无论是已接受的答案还是修正案 但没有骰子 上述解决方案的