Tag: 反序列化

枚举,单身人士和反序列化

枚举被认为是单身人士的最佳方式,其中一个原因是它隐式inheritance了Serializable 。 但是enums如何防止单身人员的反序列化问题?

强制GSON使用特定的构造函数

public class UserAction { private final UUID uuid; private String userId; /* more fields, setters and getters here */ public UserAction(){ this.uuid = UUID.fromString(new com.eaio.uuid.UUID().toString()); } public UserAction(UUID uuid){ this.uuid = uuid; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } […]

Java:为什么反序列化不会调用构造函数以及什么是最佳解决方法?

Java 1.5的Java序列化规范说: 对于可序列化对象,运行第一个非可序列化超类型的no-arg构造函数。 对于可序列化的类,字段将初始化为适合其类型的默认值。 然后通过调用类特定的readObject方法来恢复每个类的字段,或者如果未定义这些方法,则通过调用defaultReadObject方法来恢复。 请注意,在反序列化期间,不会对可序列化类执行字段初始值设定项和构造函数。 但是,这意味着如果我们在类中放置一个静态变量(例如计数器变量),它将不会像通常那样更新: class Foo { static int t; public Foo() { t++; } } public class Bar extends Foo implements Serializable { static int t; public Bar() { t++; } } 在这种情况下,如果反序列化了一个Bar实例,那么Foo的计数器是正确的, Bar的计数器是一个一个。 我想知道为什么反序列化不会调用构造函数? 由于看起来虽然这会在速度上获得一点点,但它可能会导致潜在的问题。 编译器可以很容易地设计为生成一个“静态构造函数”,它只更新将要更新的静态变量,并且在加载类时不依赖于外部信息。 另外,我想知道避免这种情况的最佳方法是什么? 我能想到的解决方案是使用静态变量上的操作打包反序列化。 感谢提前输入!

jackson反序列化json到java-objects

这是我的Java代码,用于反序列化,我试图将json字符串转换为java对象。 这样做我使用了以下代码: package ex1jackson; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class Ex1jackson { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); try { String userDataJSON = “[{\”id\”:\”value11\”,\”name\”: \”value12\”,\”qty\”:\”value13\”},” + “{\”id\”: \”value21\”,\”name\”:\”value22\”,\”qty\”: \”value23\”}]”; product userFromJSON = mapper.readValue(userDataJSON, product.class); System.out.println(userFromJSON); } catch (JsonGenerationException e) { System.out.println(e); } catch (JsonMappingException e) { […]

jackson反序列化error handling

我的问题很简单:我有以下简单的类: public class Foo { private int id = -1; public void setId(int _id){ this.id = _id; } public int getId(){ return this.id; } } 我正在尝试处理以下JSON: { “id”: “blah” } 显然,这里有一个问题(“blah”无法解析为int) 以前,Jackson会抛出类似org.codehaus.jackson.map.JsonMappingException的东西:无法从String值’blah’构造java.lang.Integer的实例:不是有效的Integer值 我同意这一点,但我想在某处注册一些允许忽略这种映射错误的东西。 我尝试使用注册的DeserializationProblemHandler(参见此处 ),但它似乎只适用于未知属性而不是反序列化问题。 你对这个问题有什么线索吗?

jackson对多种类型的反序列化

我有一个名为Instance的抽象类,然后是UserInstance和HardwareInstance两个实现。 我遇到的问题是,当我将@POST的其余端点调用到数据库中时,我理想地希望它像…/rest/soexample/instance/create将实例传递给REST端点。 如果Instance不具有多个实现的抽象,那就没问题,但是因为我有2个,所以我得到了一个Jackson.databind错误。 “问题:抽象类型需要映射到具体类型,具有自定义反序列化器,或者使用其他类型信息进行实例化” 在找到解决方案之后,我找到了一个SO答案,说我可以使用类似的东西: @JsonDeserialize(as=UserInstance.class) 但是,如果有一个抽象类的实现,它似乎是非常有用的。 假设我不能两次调用它,因为它无法确定它将是哪种类型的实例。 所以我想知道处理这种情况的最佳方法是什么? 我应该创建不同的端点吗? 喜欢: …/rest/soexample/userinstance/create & …/rest/soexample/hardwareinstance/create 我不太确定,因为我是一个noobie @ REST相关的东西,虽然积极尝试学习。 谢谢!

找不到类型类型的(Map)密钥反序列化器

我有一个具有Map的域对象: private Map<AutoHandlingSlotKey, LinkedHashSet> autoHandling; 当我序列化对象时,我得到了这个: “autoHandling” : [ “java.util.HashMap”, { } ], 这个Map的关键是一个自定义对象: public class AutoHandlingSlotKey implements Serializable { private FunctionalArea slot; // ENUM private String returnView; // ENUM 所以,我不知道如何纠正我在反序列化对象时遇到的这个问题: org.codehaus.jackson.map.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class com.comcast.ivr.core.domain.AutoHandlingSlotKey] 如果我无法访问要修改的域对象,有人可以帮助我理解如何纠正此问题吗?

将JSON反序列化为类

服务器返回JSON的这一部分: {“condition”: { “or”: [ { “and”: [ { “operand”: “a”, “operator”: “==”, “value”: “true” }, { “not”: { “operand”: “b”, “operator”: “==”, “value”: “true” } } ] }, { “and”: [ { “operand”: “b”, “operator”: “==”, “value”: “true” }, { “not”: { “operand”: “a”, “operator”: “==”, “value”: “true” } } ] } ] }} […]

当Gson反序列化JSON时,是否可以使用setter?

有没有办法在使用Gson的fromJson方法时使用给定类的fromJson方法? 我想这样做是因为对于目标类的每个String全局变量都进行了修剪。 是否有任何GSON API注释? 我知道GSON提供了编写自定义序列化器/反序列化器的能力,但我想知道是否有另一种方法来实现这一点。

jackson将变量反序列化为Json字符串

我有这样的模型: private String message; private Integer errorCode; private String data; 我从远程和消息中获取JSON字符串,errorCode变量获取正确的值。 但是,我不想反序列化到我的数据变量。 我希望它像一个json字符串: {“cat”: “1.2.3.4”, “ner”: “80”, “name”: “pinta” } 之后,我将反序列化它以反对自己。 我怎样才能做到这一点? PS:澄清问题: 我得到一个类似的Json字符串: {“data”:{“cat”:“1.2.3.4”,“ner”:“80”,“name”:“pinta”},“message”:“m”,“errorCode”:12} 反序列化后,我的变量应具有以下值: message => “m” errorCode => 12 data => “{“cat”: “1.2.3.4”, “ner”: “80”, “name”: “pinta” }”