gpt4 book ai didi

java - protobuf 负载比 JSON 大?

转载 作者:行者123 更新时间:2023-11-30 02:52:18 29 4
gpt4 key购买 nike

我有一个对象,它是“级别”对象的列表,我正在测试以两种方式使用 Spring Boot Rest Controller 传输它们:

  1. 对于 JSON,在 Rest Controller 中我使用类似的东西:

     @RequestMapping(value = "/api/v1/layers/{layername}", method =         RequestMethod.GET, produces = "application/json")
    public @ResponseBody List<Level> query(@PathVariable String layername,
    @RequestParam("northEastLat") Float northEastLat,
    @RequestParam("northEastLng") Float northEastLng,
    @RequestParam("northWestLat") Float northWestLat,
    @RequestParam("northWestLng") Float northWestLng,

    @RequestParam("southEastLat") Float southEastLat,
    @RequestParam("southEastLng") Float southEastLng,
    @RequestParam("southWestLat") Float southWestLat,
    @RequestParam("southWestLng") Float southWestLng
    ) {

    List<Level> poligons=levelService.obtainLevels(layername,southWestLng,southWestLat,northWestLng,northWestLat,northEastLng,northEastLat,southEastLng,southEastLat);
    int i=1;
    for (Level p : poligons) {

    System.out.println("poligon" + i++ + " is:" + p.toString());
    }

    return poligons;
    }
  2. 对于 Protostuff Protobuf 格式,我使用如下内容:

      @RequestMapping(value = "/api/v1/layers/{layername}", method = RequestMethod.GET,produces = "text/plain")
    public String query(@PathVariable String layername,
    @RequestParam("northEastLat") Float northEastLat,
    @RequestParam("northEastLng") Float northEastLng,
    @RequestParam("northWestLat") Float northWestLat,
    @RequestParam("northWestLng") Float northWestLng,

    @RequestParam("southEastLat") Float southEastLat,
    @RequestParam("southEastLng") Float southEastLng,
    @RequestParam("southWestLat") Float southWestLat,
    @RequestParam("southWestLng") Float southWestLng
    ) {


    List<Level> poligons=levelService.obtainLevels(layername,southWestLng,southWestLat,northWestLng,northWestLat,northEastLng,northEastLat,southEastLng,southEastLat);
    LevelList list = new LevelList(poligons);

    byte[] bytes;

    int i=1;
    for (Level p : poligons) {

    System.out.println("poligon" + i++ + " is:" + p.toString());
    }

    Schema<LevelList> schema = RuntimeSchema.getSchema(LevelList.class);
    LinkedBuffer buffer = LinkedBuffer.allocate();



    try
    {
    bytes = ProtostuffIOUtil.toByteArray(list, schema, buffer);
    }
    finally
    {
    buffer.clear();
    }

    return new String(bytes);
    }

关卡对象格式为:[{"wkb_geometry":"{"类型":"多边形","坐标":[[[24.446822,45.34997],[24.706508,45.352485]]]}","id":199,"级别":"3 ","类型":空}

关卡对象是:

@Entity(name = "Level")
@Table(name="Level2G")
@SecondaryTables({
@SecondaryTable(name="Level3G"),
@SecondaryTable(name="Level4G")
})
public class Level implements Serializable {

private static final long serialVersionUID = 1L;

// @Column(name = "wkb_geometry",columnDefinition="Geometry")
//@Type(type = "org.hibernate.spatial.GeometryType")
@Column(name="wkb_geometry")
private /*Geometry */ String wkb_geometry;

@Id
@Column(name="id")
private Integer id;


@Column(name="level")
private String level;

@Transient
private String type;

public Level() {
}

public Level(String wkb_geometry, Integer id, String level) {
this.wkb_geometry = wkb_geometry;
this.id = id;
this.level = level;
this.type = "Feature";
}

public Level(String wkb_geometry, Integer id, String level, String type) {
this.wkb_geometry = wkb_geometry;
this.id = id;
this.level = level;
this.type = type;
}

public Object getWkb_geometry() {
return wkb_geometry;
}

public void setWkb_geometry(String wkb_geometry) {
this.wkb_geometry = wkb_geometry;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getLevel() {
return level;
}

public void setLevel(String level) {
this.level = level;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

@Override
public String toString() {
return "Level{" +
"wkb_geometry=" + wkb_geometry +
", id=" + id +
", level='" + level + '\'' +
", type='" + type + '\'' +
'}';
}
}

LevelList 对象只是 Level 对象的列表

问题是,与 JSON (3.7kb) 相比,Protostuff 获得了更大的有效负载 (26 kb)。为什么?

对于第二个选项,我也尝试设置“application/octet-stream”以直接返回字节,但结果仍然相同。我还比较了 JSON 和 protobuf 的速度;即使负载更大,protobuf 也具有更好的性能。知道为什么吗?

最佳答案

Protostuff 和 Protobuf 不是一回事。 Protostuff 是一个包装器库,可以使用许多不同的序列化格式。它还支持您似乎正在使用的运行时模式生成。该运行时模式需要随消息一起发送额外的元数据,以告诉接收者有关消息的模式。我猜您看到的大消息主要来自此运行时架构数据。

使用标准 Protobuf,模式不会随消息一起发送,因为假设发送者和接收者已经就编译到两个程序中的 .proto 文件提供的模式达成一致。如果您将 Protobuf 与标准 .proto 文件一起使用,您会发现它生成的消息比 JSON 小得多。

关于java - protobuf 负载比 JSON 大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38245281/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com