Java 当对象实现可序列化时,Restlet/Jackson的工作方式不同

Java 当对象实现可序列化时,Restlet/Jackson的工作方式不同,java,jackson,restlet,Java,Jackson,Restlet,我正在使用Restlet和Jackson converter发送一个包含一些基本字段的对象。到目前为止,效果很好。 但我需要我的对象来实现Serializable,因为我需要将它存储在GAE的memcache中。 出于某种原因-当类实现Serializable时,事情就停止了 Restlet发送的字符串表示形式与以前不同,我甚至无法在服务器上打印该字符串。我试着逐字符打印它的字节值,第一个数字是: 0xfffd 0xfffd 0x0000 0x0005 0x0073 0x0072 非常感谢 这

我正在使用Restlet和Jackson converter发送一个包含一些基本字段的对象。到目前为止,效果很好。 但我需要我的对象来实现Serializable,因为我需要将它存储在GAE的memcache中。 出于某种原因-当类实现Serializable时,事情就停止了

Restlet发送的字符串表示形式与以前不同,我甚至无法在服务器上打印该字符串。我试着逐字符打印它的字节值,第一个数字是:

0xfffd 0xfffd 0x0000 0x0005 0x0073 0x0072

非常感谢

这可能不是您想要的,但它非常相似,我认为它可能有用

我使用Restlet/Android访问我在Restlet/GAE中构建的API。在某种程度上,我不得不更改表示系统中基本对象的pojo类,以实现可序列化。当我这样做时,我试图从服务器获取这些对象的尝试开始失败,出现415个错误。为了解决Restlet对发送哪个表示的混淆,我添加了:

Engine.getInstance().getRegisteredConverter().add(0,新JacksonConverter())

在做我的文章之前()。以下是一些额外的讨论:


我意识到我没有使用原语-关键的联系是,当我添加Serializable时,事情就坏了。

这可能不是您想要的,但它非常相似,我认为它可能有用

我使用Restlet/Android访问我在Restlet/GAE中构建的API。在某种程度上,我不得不更改表示系统中基本对象的pojo类,以实现可序列化。当我这样做时,我试图从服务器获取这些对象的尝试开始失败,出现415个错误。为了解决Restlet对发送哪个表示的混淆,我添加了:

Engine.getInstance().getRegisteredConverter().add(0,新JacksonConverter())

在做我的文章之前()。以下是一些额外的讨论:


我意识到我没有使用原语-关键的联系是,当我添加Serializable时,事情就坏了。

发生的事情是,您得到的结果是将DefaultConverter应用于返回值,而不是JacksonConverter。DefaultConverter将可序列化对象转换为ObjectRepresentation,ObjectRepresentation是二进制表示(对象的序列化形式)。在没有被请求的特定媒体类型的情况下,转换器逻辑将可序列化视为可平等地转换为ObjectRepresentation或JacksonRepresentation,并且由于转换器的排序方式,它选择前者

有几种方法可以解决这个问题。最简单的方法是在请求中显式指定所需的媒体类型(MediaType.APPLICATION_JSON)

一个更健壮的解决方案是用自己的自定义版本替换JacksonConverter,该版本的空变量得分高于当前值0.5。如果要覆盖当前JacksonRepresentation行为,即为每次转换创建新的ObjectMapper,或者如果要使用Jackson 2.0,则无论如何都要这样做。在restlet讨论列表中搜索我关于如何实现这一点的帖子。(tpeierls)


这种行为很可能在最近的版本中已经被修复,我知道与此相关的问题正在研究中,因此,在提交任何行动方案之前,请在问题跟踪器中搜索JacksonConverter。

发生的情况是,您得到的结果是将DefaultConverter应用于返回值,而不是JacksonConverter。DefaultConverter将可序列化对象转换为ObjectRepresentation,ObjectRepresentation是二进制表示(对象的序列化形式)。在没有被请求的特定媒体类型的情况下,转换器逻辑将可序列化视为可平等地转换为ObjectRepresentation或JacksonRepresentation,并且由于转换器的排序方式,它选择前者

有几种方法可以解决这个问题。最简单的方法是在请求中显式指定所需的媒体类型(MediaType.APPLICATION_JSON)

一个更健壮的解决方案是用自己的自定义版本替换JacksonConverter,该版本的空变量得分高于当前值0.5。如果要覆盖当前JacksonRepresentation行为,即为每次转换创建新的ObjectMapper,或者如果要使用Jackson 2.0,则无论如何都要这样做。在restlet讨论列表中搜索我关于如何实现这一点的帖子。(tpeierls)


这种行为很可能已在最近的版本中得到修复,我知道与此相关的问题正在解决中,因此在采取任何行动之前,请务必在问题跟踪程序中搜索JacksonConverter。

谢谢!我试试这个。这个链接非常有用。似乎在开头添加jackson的想法支持Tim的答案。谢谢!我试试这个。这个链接非常有用。在开头添加jackson的想法似乎支持Tim的答案。感谢您的详细解释。我会尝试你的建议,看看什么效果最好。谢谢你的详细解释。我会试试你的建议,看看什么效果最好。