2017-09-15 95 views
0

我正在使用Retrofit2處理來自Android客戶端的請求。我請求類型PUT和要求型號是:Retrofit 2請求正文中的不必要的serialVersionUID

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); 

} 

我從演示製作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那裏雖然不能在請求模型包括?

回答

1

串行版本(serialVersionUID)是一個唯一標識符,用於確定不同版本的類型是否兼容。

因此,例如,您要發送一個枚舉,並且在內部,Retrofit必須序列化該值以通過網絡發送它。

如果響應是相同的類型,那麼你會期望Retrofit將反序列化響應並給你相同的枚舉類型。

在序列化過程中,Java執行計算並生成名爲serialVersionUID的值。簽名是喜歡,

private static final long serialVersionUID = -1766960164825680704L; 

改造,通過設置的serialVersionUID自定義值,走的是責任,以確保兼容性。