【问题标题】:Unnecessary serialVersionUID in Retrofit 2 Request BodyRetrofit 2 请求正文中不必要的 serialVersionUID
【发布时间】:2018-02-24 10:58:45
【问题描述】:

我正在使用 Retrofit2 向 Android 客户端发出请求。我的请求类型是 PUT,请求模型是:

public class BusinessStatus {

  public enum STATUS
  {
    AVAILABLE, UNAVAILABLE
  }

  public STATUS status ;

  public BusinessStatus(STATUS status) {
    this.status = status;
  }

}

我的改造api接口服务是:

public interface BusinessStatusApi {

  @PUT("abul/{driverId}/abulass")
  Observable<Response<Void>> updateBusinessStatus(@Path("driverId") String driverId, @Body BusinessStatus businessStatus);

}

我正在像这样从 Presenter 发出 PUT 请求:

 public void updateAbulAssStatus(final String driverId, STATUS status) {
    BusinessStatus businessStatus = new BusinessStatus(status);
    Observable<Response<Void>> call = mBusinessStatusApi
        .updateBusinessStatus(driverId, businessStatus);

    Subscription subscription = call
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            response -> {
              if (response.isSuccessful()) {

              } else {
                Toast.makeText(mContext.getApplicationContext(), "Something went wrong",
                    Toast.LENGTH_SHORT).show();
              }
            },
            e -> {
              if (e instanceof HttpException) {
                ResponseBody responseBody = ((HttpException) e).response().errorBody();
                Timber.d("ErrorMessage", responseBody);
              }
            },
            () -> {
              Timber.d("Status", "Completed");
            }
        );

  }

但是一个不寻常的不必要的serialVersionUID被添加到请求正文并从后端API获得400。

这是我的 okhttp 日志:

PUT http://localgost:8080/v1/abul/10011/abulass http/1.1
09-15 14:55:01.394 12402-12578 D/OkHttp: Content-Type: application/json; charset=UTF-8
09-15 14:55:01.397 12402-12578/ D/OkHttp: Content-Length: 62
09-15 14:55:01.398 12402-12578/ D/OkHttp: {"status":"AVAILABLE","serialVersionUID":-1766960164825680704}

为什么尽管请求模型中没有包含不必要的serialVersionUID,但它却被添加到那里?

【问题讨论】:

    标签: android rx-java retrofit2 okhttp


    【解决方案1】:

    序列版本 (serialVersionUID) 是一个唯一标识符,用于确定一个类型的不同版本是否兼容。

    因此,例如,您正在发送一个枚举,并且 Retrofit 必须在内部对值进行序列化以通过网络发送它。

    如果响应的类型相同,那么您会期望 Retrofit 会反序列化响应并为您提供相同的枚举类型。

    在序列化过程中,Java 执行计算并生成一个名为 serialVersionUID 的值。签名是这样的,

    private static final long serialVersionUID = -1766960164825680704L;
    

    Retrofit 通过为 serialVersionUID 设置自定义值,负责确保兼容性。

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 2017-11-18
      • 2015-12-11
      • 1970-01-01
      • 2016-03-25
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多