- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有以下映射到 Jackson 完整数据绑定(bind)的 Java 对象:
public class Student implements Serializable{
private ObjectNode name; // two keys: "first_name", "last_name"
// getter and setter ...
}
我有以下 Spark 代码尝试序列化闭包变量 student
类型 Student
由于范围不同。
class A(student : Student) extends Serializable {
def process(input: DataFrame): Unit = {
val test = input.map { a =>
print(student)
}
}
}
给出以下错误:Caused by: java.io.NotSerializableException: com.fasterxml.jackson.databind.node.ObjectNode
我明白为什么我会收到这样的错误。基本上,Spark 将尝试序列化所有超出范围的变量 a.k.a. 闭包并将其传递给每个执行程序。但是由于 ObjectNode 本身不是 Serializable
,执行者无法获得 Student
实例。
我的问题是,我可以通过哪些方式解决这个问题?
我试过使用 Map<String, String>
而不是 ObjectNode
, 但自 ObjectNode
的 put
和 set
只能有“原语”和JsonNode
作为值(value),当我尝试这样的事情时它会导致错误:
ObjectNode meta_info = JsonNodeFactory.instance.objectNode();
meta_info.set("field name", student.getName());
最佳答案
有几个选项。
如果您只需要 Object 节点用于 json 序列化目的,那么您可以重写您的 Student
类并完全删除 ObjectNode
。在您的示例中,您可以用 firstName
和 lastName
字段替换它
class Name implements Serializable {
String firstName;
String lastName;
}
但是,如果这不可能,您可以像这样进行自定义序列化
public class Student implements Serializable {
private transient ObjectNode name;
private void writeObject(ObjectOutputStream out) throws IOException {
ObjectMapper mapper = new ObjectMapper();
out.writeUTF(mapper.writeValueAsString(name));
// other fields here
}
private void readObject(ObjectInputStream in) throws IOException,
ClassNotFoundException {
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(in.readUTF());
if (!node.isObject()) {
throw new IOException("malformed name field detected");
}
name = (ObjectNode) node;
// read other fields
}
}
在我的示例中,我将对象节点序列化为 json 字符串,但您当然可以遍历对象节点字段,分别存储每个字段。
您可以在 ObjectOutputStream
中阅读有关自定义序列化的更多信息java文档。
您也可以尝试不同的 data serializers喜欢Kryo .
关于java - Spark 关闭问题中 Jackson ObjectNode 的 NotSerializableException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39500081/
我有以下 ObjectNode。 handlerObjectNode -> {"Info":{"Brand":{"BrandName":"TOP OF THE WORLD"}}} 我有另一个具有以下格
我正在使用 play2.2.1,现在遇到错误: com.fasterxml.jackson.databind.node.ObjectNode 无法转换为 org.codehaus.jackson.no
我的 @RequestBody ObjectNode objectNode 中的 JSON { "script": {"id":2,"nom":"tes","libellepr
我有一个通过 ObjectNode 获得的 JSON。 但是,我无法获取对象“LibellePrerequis”的ID使用的方法是否正确? 如果我这样做: String libelleprerequi
ObjectNode row = Json.newObject(); row.put("0", a); row.put("1", x); row.put("2", y); 现在我有了 list Lis
我需要向现有的 ObjectNode 添加一个新项目,给定一个键和一个值。该值在方法 sig 中指定为 Object,应该 是 ObjectNode.set() 接受的类型之一(String,Inte
我正在尝试设置代码来使用 jackson 创建节点树,然后可以使用该代码来编写 JSON 或 XML。我已经像这样手动创建了节点树: XmlMapper NodeMap = new XmlMapper
如何使用 Jackson 从字符串创建 ObjectNode? 我试过: ObjectNode json = new ObjectMapper().readValue("{}", ObjectNode
我有一个包含一些数据的 com.fasterxml JsonNode 对象。我需要对其数据进行一些操作。我在谷歌上搜索了答案,但没有得到正确的答案。你能建议我如何操作 JsonNode 数据吗?我还尝
我正在使用 Jackson 进行 JSON 解析。JsonNode 和 ObjectNode 有什么区别? 以及用于以字符串格式映射 JSON。 最佳答案 快速回答 JsonNode :抽象类,读取
我想扩展 ObjectNode,这样我就可以有几个辅助方法来从 JSON 中获取几个特定字段。例如 public class MyNode extends ObjectNode { public
我正在尝试增加 ObjectMapper 的重用,目前正在考虑移动以下代码: ObjectMapper mapper = new ObjectMapper(); SimpleModule module
我想从 json 中删除一些值。json格式是这样的: { "cod": "200", "message": 0.0135, "cnt": 40, "list": [
这个问题已经有答案了: How to directly write to a JSON object (ObjectNode) from ObjectMapper in Jackson JSON? (
你好,我有一些 com.fasterxml.jackson.databind.node.ObjectNode 形式的 Json 数据,我想将它存储在 MongoDB 中。 如何将 ObjectNode
我正在使用 jackson 将我的对象序列化为 json。我正在使用以下代码: ObjectMapper mapper = new ObjectMapper(); JsonNodeFactory no
首先谁能给我解释一下ObjectNode和JsonNode有什么区别,用在什么地方? 那如果我想把一个JSON字符串转成ObjectNode怎么办呢? 最佳答案 你可以这样做: ObjectMappe
我想使用 Swagger 为我的 Spring Boot API 提供 API 文档。我设法让 Springfox 2.3.0 正常工作,除了 Controller 返回 ObjectNode 之外,
我有这个代码: static String createRequestJson(String apiKey, String apiSecret) { JsonNodeFactory factory
假设我有以下映射到 Jackson 完整数据绑定(bind)的 Java 对象: public class Student implements Serializable{ private O
我是一名优秀的程序员,十分优秀!