繁体   English   中英

如何将Java Map序列化为PHP的数组序列化格式

[英]How to serialize a Java Map to PHP's array serialization format

我想将HashMap转换为String ,它对应于PHP的Array序列化格式,如下所述:

http://php.net/manual/zh/function.serialize.php

例如:

a:5:{s:5:"width";i:450;s:6:"height";i:352;s:4:"file";s:32:"2018/09/Sawtooth-Oak_450_a-1.jpg";s:5:"sizes";a:9:{s:9:"thumbnail";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-150x150.jpg";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:10:"image/jpeg";}s:6:"medium";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-300x235.jpg";s:5:"width";i:300;s:6:"height";i:235;s:9:"mime-type";s:10:"image/jpeg";}s:32:"twentyseventeen-thumbnail-avatar";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-100x100.jpg";s:5:"width";i:100;s:6:"height";i:100;s:9:"mime-type";s:10:"image/jpeg";}s:21:"woocommerce_thumbnail";a:5:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-250x250.jpg";s:5:"width";i:250;s:6:"height";i:250;s:9:"mime-type";s:10:"image/jpeg";s:9:"uncropped";b:1;}s:18:"woocommerce_single";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-350x274.jpg";s:5:"width";i:350;s:6:"height";i:274;s:9:"mime-type";s:10:"image/jpeg";}s:29:"woocommerce_gallery_thumbnail";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-100x100.jpg";s:5:"width";i:100;s:6:"height";i:100;s:9:"mime-type";s:10:"image/jpeg";}s:12:"shop_catalog";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-250x250.jpg";s:5:"width";i:250;s:6:"height";i:250;s:9:"mime-type";s:10:"image/jpeg";}s:11:"shop_single";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-350x274.jpg";s:5:"width";i:350;s:6:"height";i:274;s:9:"mime-type";s:10:"image/jpeg";}s:14:"shop_thumbnail";a:4:{s:4:"file";s:32:"Sawtooth-Oak_450_a-1-100x100.jpg";s:5:"width";i:100;s:6:"height";i:100;s:9:"mime-type";s:10:"image/jpeg";}}s:10:"image_meta";a:12:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";s:11:"orientation";s:1:"0";s:8:"keywords";a:0:{}}}

我从以下测试图开始:

        HashMap images2 = new HashMap();
        images2.put("test1", "t1");

        imagesArray.put("width", image.getWidth());
        imagesArray.put("height", image.getHeight());
        imagesArray.put("file", destinationFile);
        imagesArray.put("sizes", images2);

String jsonResult = mapper.writerWithDefaultPrettyPrinter()
                                .writeValueAsString(imageMap);

                        System.out.println(jsonResult);

结果是:

    {
  "file" : "/images/bolivia.jpg",
  "sizes" : {
    "test1" : "t1"
  },
  "width" : 450,
  "height" : 450
}

Java不使用PHP的数组序列化格式,因此您必须自己编写或更改方法。 您有以下选择:

  1. 遍历Map的条目,并为每个条目输出其类型, s表示Stringi表示int等,以及其余信息( String包括长度等)。

  2. 从您的PHP脚本中,更改方法,而不是使用JSON来读取PHP的数组序列化。 这更多是开放的事实上的标准,并且由于大多数语言现在都支持JSON或具有易于使用的库,因此您也可以使用其他编程语言。

  3. 使用将Java对象保存为PHP的序列化格式的库。 如果您对PHP脚本没有控制权,并且在不破坏其他功能的情况下绝对不能更改它,那么我只会建议您使用此选项。 如果您不拥有PHP代码,或者无法有效维护它,那么这可能是一个可行的选择。 快速搜索执行此操作的Java库,例如:

https://github.com/marcospassos/java-php-serializer

好的,我找到了解决方案-我将使用

<!-- https://mvnrepository.com/artifact/com.xk72/pherialize -->
<dependency>
    <groupId>com.xk72</groupId>
    <artifactId>pherialize</artifactId>
    <version>1.2.4</version>
</dependency>

考虑使用Google的protobuf(原型缓冲区)。 Protobuf以多种语言实现,包括Java,PHP,Python,C ++等。

它具有语言独立性的优势-您可以定义缓冲区结构,然后将定义文件编译为您选择的语言。

这是一个带有2个字段的protobuf的简单示例,仅供参考:

syntax = "proto2";
message CookiejarTransaction {
    optional string action = 1; // Action is either "bake" or "eat"
    optional uint32 amount = 2; // Amount is number of cookies
}

免责声明:除了对使用该工具感到满意的开发人员以外,我对Protobufs毫无兴趣。

https://developers.google.com/protocol-buffers/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM