0

我想使用 ektorp java 客户端将我的对象发送到 couchdb。但我无法正确地将我的 bytearray 值写入 couchdb。我的java对象如下:

在此处输入图像描述

如果我将字节数组转换为字符串:

在此处输入图像描述

元数据值在 couchdb 上保存为“AgIGZm9vBmJhegA=”(base64),这意味着“foobaz”。为什么我的 bytearray 值改变了?

在此处输入图像描述

我的示例代码:

private CouchDbInstance dbInstance;
private CouchDbConnector db;    

    ... 

    Map<String, Object> doc = new HashMap<>();
    doc.put("_id", "foo.com:http/");

    byte[] serilazeData = IOUtils.serialize(writer, fieldValue);
    doc.put("metadata", serilazeData);

    ...
    db.update(doc);

我的主要代码块

    public void put(K key, T obj) {

        final Map<String, Object> doc = new HashMap<>();
        doc.put("_id", key.toString());

        Schema schema = obj.getSchema();

        List<Field> fields = schema.getFields();
        for (int i = 0; i < fields.size(); i++) {
          if (!obj.isDirty(i)) {
            continue;
          }
          Field field = fields.get(i);
          Schema.Type type = field.schema().getType();
          Object fieldValue = obj.get(field.pos());
          Schema fieldSchema = field.schema();

          fieldValue = serializeFieldValue(fieldSchema, fieldValue);
          doc.put(field.name(), fieldValue);
        }
        db.update(doc);

      }

      private Object serializeFieldValue(Schema fieldSchema, Object fieldValue ){
        ...
            byte[] data = null;
            try {
              SpecificDatumWriter writer = getDatumWriter(fieldSchema);
              data = IOUtils.serialize(writer, fieldValue);
            } catch (IOException e) {
              LOG.error(e.getMessage(), e);
            }
            fieldValue = data;
         ...
        return fieldValue;
      }
4

3 回答 3

0

Ektorp 使用 Jackson 进行 json 序列化,我认为 jackson 对于字节数组默认使用 base64。只要您使用 Ektorp 进行读/写,就不会有任何问题。

但是我在您的代码中看到您有自己的某种类型系统,这使事情变得复杂。我建议你使用 POJOS 而不是自己滚动,因为如果你自己做的话,你不会从 ektorp 和 jackson 那里得到太多帮助。

于 2016-08-01T10:10:13.603 回答
0

该值是 base64 编码的字符串“foobaz”。您可能也应该发布您的代码以获得有关此问题的任何有意义的反馈。

编辑:既然您提供了代码,那么您尝试更新的对象是否可能已经存在于数据库中?如果是,您需要先获取它或提供正确的现有修订 ID 以进行更新。否则更新将被拒绝。

于 2016-07-31T12:36:54.293 回答
0

CouchDB 存储 JSON 文档,而 JSON 不支持字节数组,所以我猜 Ektorp 在将对象转换为 JSON 期间,在发送到 CouchDB 之前应用了自己的 Base64 转换,这可能会跳过字节数组中的一些字符。

您可能更愿意通过在调用 Ektorp 之前应用自己的 Base64 序列化来回避 Ektorp 行为,然后在从 CouchDB 获取文档后自行反序列化。或者您可以使用 Jackson 之类的东西,它将在后台处理对象/JSON 转换,包括字节数组。

于 2016-07-31T15:50:47.873 回答