让 ServiceStack 保留类型信息

2024-03-26

我正在使用 ServiceStack 将一些对象序列化和反序列化为 JSON。考虑这个例子:

public class Container
{
    public Animal Animal { get; set; }
}

public class Animal
{
}

public class Dog : Animal
{
    public void Speak() { Console.WriteLine("Woof!"); }
}

var container = new Container { Animal = new Dog() };
var json = JsonSerializer.SerializeToString(container);
var container2 = JsonSerializer.DeserializeFromString<Container>(json);

((Dog)container.Animal).Speak(); //Works
((Dog)container2.Animal).Speak(); //InvalidCastException

最后一行抛出 InvalidCastException,因为 Animal 字段被实例化为 Animal 类型,而不是 Dog 类型。有什么方法可以告诉 ServiceStack 保留该特定实例属于 Dog 类型的信息吗?


DTO 中的继承是一个坏主意 - DTO 应该尽可能自描述,并且通过使用继承,客户端实际上不知道服务最终返回什么。这就是为什么您的 DTO 类在大多数“基于标准”的序列化器中无法正确反序列化的原因。

没有充分的理由在 DTO 中使用接口(并且很少有理由在 POCO 模型上使用它们),这是一种使用接口来减少应用程序代码中的耦合的货物崇拜习惯,而这些代码被不假思索地泄漏到了 DTO 中。但跨进程边界,接口只会增加耦合(只是在代码中减少),因为消费者不知道要反序列化成什么具体类型,因此它必须发出特定于序列化的实现提示,这些提示现在在线上嵌入了 C# 关注点(所以现在甚至C# 命名空间将破坏序列化),并且现在限制您的响应由特定序列化程序使用。在线泄露 C# 问题违反了服务实现互操作性的核心目标之一。

由于 JSON 规范中没有“类型信息”的概念,为了让继承在 JSON 序列化器中工作,它们需要发出专有扩展 to the JSON 线格式 http://www.json.org/包含此类型信息 - 现在将您的 JSON 负载耦合到特定的 JSON 序列化器实现。

ServiceStack 的 JsonSerializer https://github.com/ServiceStack/ServiceStack.Text/将此类型信息存储在__type属性,并且由于它会大大增加有效负载,因此只会为需要它的类型发出此类型信息,即Interfaces, 后期绑定object类型或abstract类。

话虽如此,解决方案是改变Animal要么成为界面 or an abstract类,但是建议不要在 DTO 中使用继承。

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

让 ServiceStack 保留类型信息 的相关文章

  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号
  • 将列表(对象)转换为列表(字符串)

    有没有办法转换List of Object to a List of String 在 c 或 vb net 中而不迭代所有项目 幕后迭代很好 我只想要简洁的代码 Update 最好的方法可能就是进行新的选择 myList Select f
  • 有没有办法使 C90 标准中的枚举无符号? (符合 MISRA-C 2004 标准)

    我正在尝试找到一种使枚举 无符号 的方法 enum x1 0 x2 x3 uint8 t x2 lt PC LINT MISRA C 2004 will complain about mixing signed and unsigned h
  • 返回指向 std::vector 中的对象的 a

    我有一个关于返回对向量元素的引用的非常基本的问题 有一个向量vec存储类的实例Foo 我想访问这个向量中的一个元素 不想使用向量索引 我应该如何编码该方法getFoo here include
  • C++ 私有静态成员变量

    此 C 代码在编译时产生链接器错误 A h class A public static void f private static std vector
  • async wait 在调用异步方法时返回 Task> 而不是 List

    我正在尝试了解 async wait 的用法 并且研究了一些博客文章 现在我已经编写了一个测试代码 但它没有按照我期望的方式工作 我有一个返回列表的方法 private List
  • 使用 jackson 序列化 Map.Entry 时出现问题

    如果我尝试反序列化以下存储为字符串的类型 List
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 如何附加到 xml

    我有这个xml
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • 使用 jQuery 获取 JSON Facebook Graph API 用户信息

    我正在尝试使用图形 API 来获取有关用户的一些基本信息 无需用户授权 只需获取公共详细信息 我正在尝试使用 jQuery 和 getJSON 来获取数据并解析它 但我很难弄清楚如何访问我想要的键值对 我想要有类似的东西 var fburl
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • SignTool 错误:访问被拒绝

    我尝试在安装了 VS2010 的 Windows Server 2008 R2 x64 上使用新的代码签名证书对 NET 应用程序进行authenticode 签名 但 SignTool 始终响应访问被拒绝 SignTool exe sig
  • 在 try catch 块中返回到 catch 内是否不好?这是很好的做法

    在 try catch 块中从 C 中的 catch 块返回值是不好的做法吗 try Some code return 1 catch return 0 哪种使用 try catch 的方法是好的做法 不需要 只要返回的值是你想要的 你可以
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码
  • 如何将 char 转换为 unsigned int?

    我有一个字符数组 它实际上用作字节数组 而不是用于存储文本 在数组中 有两个特定字节表示我需要存储到无符号 int 值中的数值 下面的代码解释了设置 char bytes bytes 2 bytes 0 0x0C For the sake

随机推荐

  • 将另一个 data.frame 中的一行添加到 qplot

    是否可以在现有绘图中添加一条线 例如附加时间序列 我知道如何添加水平或垂直线 但如何从其他 data frames 添加 q myplot lt qplot datefield myvalue data mydf geom c line c
  • 如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?

    我是 Qt 新手 每天都在学习新东西 目前 我正在利用空闲时间为我的诺基亚 N900 开发一个小型应用程序 一切都很好 我可以在设备上编译和运行 Maemo 应用程序 我刚刚了解到foreachQt 中的关键字 我知道它不在 C 中 所以我
  • cakephp 验证和正则表达式

    我正在 cakephp1 3 工作 我必须使用 model i 中的 cakephp 验证来验证我的表单 我添加了一个正则表达式来限制特殊字符输入 我的代码写如下 var validate array name gt array uniqu
  • Android 模拟器出现蓝屏死机

    无论我从 Android SDK 和 AVD Manager 创建哪种类型的 Android 虚拟设备 每当我启动它时 我的整个笔记本电脑都会在出现蓝屏死机后关闭 我在事件系统日志中看到此错误 驱动程序 VPCAppSv sys 已被阻止加
  • 如何增加 jQuery 变量?

    我正在尝试使用 jquery 浏览图片库 因此我有一个按钮 该按钮应该将变量加 1 然后使用它来加载下一张图片 使用最上面的答案this https stackoverflow com questions 11338499 incremen
  • 学说、命名空间和自动加载实体

    我想在我的项目中使用 Doctrine 2 我有一些问题 我阅读了文档 但可能我做错了什么 我想自动加载实体类 并且文档中的方法不起作用 我的 bootstrap php
  • Java继承与抽象方法

    我有很多 形式 类 所有这些都扩展了Form 我有一个名为的抽象类FormService以及扩展此类的特定表单服务 我想做的是有一个名为的抽象方法populate 它采用一种类型形式 从而通过继承为给定类型调用正确的服务 所以我有类似的东西
  • 从文档和 jekyll 源文件夹配置提供服务的 GitHub 页面

    标准 F 遵循 ProjectScaffold 的文档具有以下结构 project docs content files output tools 生成的文档保存到output 然后被推送到gh pages branch 最近 GitHub
  • 使用 PerformanceCounters 来定位特定驱动器

    伙计们 我有以下代码 using System Diagnostics private PerformanceCounter diskRead new PerformanceCounter private PerformanceCounte
  • 具有 NA 值的数据框两列的总和

    我有一个包含一些 NA 值的数据框 我需要两列的总和 如果一个值为 NA 我需要将其视为零 a b c d 1 2 3 4 5 NA 7 8 e 列应该是 b 和 c 的总和 e 5 7 我尝试了很多事情 并进行了两打搜索 但没有运气 这似
  • InnoDB MySQL 5.5 中的 TEXT 与 VARCHAR。何时使用每一项

    MySQL 5 5 的 InnoDB 存储引擎中 text 和 varchar 的主要区别是什么 如果我们谈论不超过 5000 个字符的变量文本字段 是否使用 text 或 varchar 5000 根据论坛帖子innodb com 从 I
  • 在 vb.net 中生成随机字符串

    我需要在 vb net 中生成随机字符串 该字符串必须由 随机选择的 字母 A Z 必须大写 和散布的随机数字组成 它还需要能够生成具有设定长度的它们 感谢您的帮助 这让我发疯 如果你可以将其转换为 VB NET 这很简单 我想说你就可以了
  • 在 WiX 中重新启动后继续安装

    我正在尝试使用 WixStandardBootstrapperApplication 创建引导应用程序 除了处理重启之外 它可以很好地完成我需要它做的所有事情 我需要安装一组EXE文件 只有第一个是 NET 4 5 需要重新启动 我会延迟重
  • Flex 和 Bison 彼此需要什么?

    当 Flex 和 Bison 一起使用时 为什么 Flex 文件需要 includebison 创建的 C 头文件 编译需要 bison 和 flex 创建的 C 源文件 bison 和 flex 创建的 C 源文件相互需要什么 bison
  • 如何在 vim 中标记自定义命令的视觉选择?

    我想做这样的事情 我选择一段文本 然后按 Ctrl B 所选文本被 或我选择的其他符号包围 我在想 如果我能以某种方式标记选择的开始和结束位置 我可以将 Ctrl B 映射到视觉模式下的某个组合键 在这些标记上移动并放置所需的文本 我怎样才
  • jQuery $(this).find() 和 $(selector,this) 不起作用

    我在获取 jQuery 时遇到问题 this 功能按预期工作 或者更确切地说 完全工作 据我了解 两者 chamber each function this find cell slice 0 19 css background color
  • 如何使属性在 xml 模式中唯一?

    我想让元素的属性像主键一样是唯一的 怎么做呢 像这样的东西应该有效
  • JavaScript - Date()、new Date() 和 ISODate 之间的区别

    我看过这个问题的各种版本 但没有一个能满足我的需求 我想为 MongoDB 创建 ISODate 并且我正在使用 Node js 在节点中 当我这样做时 console log Date I get 2016 年 9 月 26 日星期一 1
  • 在 opencv 上压缩图像(imwrite)。如何明确设置压缩因子?

    我想知道是否有一种方法可以在 opencv 上压缩图像时轻松指定压缩因子 而无需声明虚拟向量 如果我声明一个向量 p 类似于这次讨论 https stackoverflow com questions 801054 opencv cvsav
  • 让 ServiceStack 保留类型信息

    我正在使用 ServiceStack 将一些对象序列化和反序列化为 JSON 考虑这个例子 public class Container public Animal Animal get set public class Animal pu