Retrofit 2 Request Body中不必要的serialVersionUID

时间:2017-09-15 09:34:16

标签: android rx-java retrofit2 okhttp

我正在使用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被添加到Request Body 并从Backend 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,尽管它没有包含在请求模型中?

1 个答案:

答案 0 :(得分:1)

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

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

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

在序列化过程中,Java执行计算并生成名为 serialVersionUID 的值。签名就像,

private static final long serialVersionUID = -1766960164825680704L;

通过为 serialVersionUID 设置自定义值进行改造,负责确保兼容性。