2013-06-12 4 views

ответ

-1

Это не пример, и я (пока) не сделал это сам, но вот как я бы это сделать:

Один из способов заключается в расширении JsonObjectRequest и сериализации и десериализации каждый буфер протокола в Json с помощью:

Message someProto = SomeProto.getDefaultInstance(); 
String jsonFormat = JsonFormat.printToString(someProto); 

Message.Builder builder = SomeProto.newBuilder(); 
String jsonFormat = _load json document from a source_; 
JsonFormat.merge(jsonFormat, builder); 

См: https://code.google.com/p/protobuf-java-format/

в противном случае, если вы хотите отправить протокол буфера сериализации в байт [] вы можете расширить Request<T>. Вы должны отменить public byte[] getBody() для тела запроса/полезной нагрузки, а защищен Response<Message> parseNetworkResponse(NetworkResponse response) для ответа.

Затем вы должны использовать следующие функции для сериализации буфера протокола.

byte[] toByteArray(); 

parseFrom(byte[] data); 

Если у вас есть решение, не забудьте поделиться.

1

Я сделал это, работа в порядке, надеюсь, что это полезно. Сначала создайте класс ProtobufRequest, как показано ниже, который расширяет Request, Request является основным классом запроса в Volley, тогда вы можете создать собственный запрос, который расширяет ProtobufRequest, что do custom doParse(). как ссылка.

RequestData является SomeProto сообщения,

private static final int SOCKET_TIMEOUT = 30000; 

/** Content type for request. */ 
private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; 

private static final Object sDecodeLock = new Object(); 

private RequestData mRequestData; 
private BaseCallback mCallback; 

public ProtobufRequest(RequestData data, BaseCallback callback) { 
    super(Method.POST, Constants.SERVER_URL, callback); 
    // TODO Auto-generated constructor stub 
    mRequestData = data; 
    mCallback = callback; 
    this.setRetryPolicy(getRetryPolicy()); 
} 

@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = new HashMap<String, String>(); 
    headers.put("Charset", "UTF-8"); 
    headers.put("Content-Type", "application/x-protobuf"); 
    headers.put("Accept", "application/x-protobuf"); 

    return headers; 
} 

@Override 
public String getBodyContentType() { 
    return PROTOCOL_CONTENT_TYPE; 
} 

@Override 
public RetryPolicy getRetryPolicy() { 
    RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, 
      DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
    return retryPolicy; 
} 

    /** 
    ** write the protobuf data to http request,it is very important 
    */ 
@Override 
public byte[] getBody() throws AuthFailureError { 
    if (mRequestData == null) { 
     return super.getBody(); 
    } else { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     try { 

      baos.write(mRequestData.toByteArray()); 
     } catch (IOException e) { 
      return super.getBody(); 
     } 

     return baos.toByteArray(); 
    } 
} 

@Override 
protected void deliverResponse(Object arg0) { 
    mCallback.onResponse(arg0); 
} 

    /** 
    ** parse the response result 
    */ 
@Override 
protected Response<T> parseNetworkResponse(NetworkResponse response) { 
    synchronized (sDecodeLock) { 
     try { 
      return doParse(response, HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (OutOfMemoryError e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 
} 

abstract protected Response<T> doParse(NetworkResponse response, Entry entry) 


public interface BaseCallback extends Listener<Object>, ErrorListener { 

} 
-1

Просто наклеивании это здесь в случае, если это полезно: Я искал вокруг много для общего способа сделать что-то похожее на ответ jeff wang «s. Я ничего не мог найти, поэтому написал это. Дайте мне знать, если у вас есть какой-либо способ избавиться от незарегистрированного отлит в там ...

ProtobufRequest.java

public class ProtoBufRequest<ReqT extends Message, RespT extends Message> extends Request<RespT> { 

    private ReqT request; 
    private final Class<RespT> responseType; 
    private final Listener<RespT> listener; 
    private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; 
    private static final int SOCKET_TIMEOUT = 30000; 

    public ProtoBufRequest(int method, String url, ReqT data, Class<RespT> responseType, 
         Listener<RespT> listener, Response.ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.listener = listener; 
     this.request = data; 
     this.responseType = responseType; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> headers = new HashMap<String, String>(); 
     headers.put("Charset", "UTF-8"); 
     headers.put("Content-Type", PROTOCOL_CONTENT_TYPE); 
     headers.put("Accept", PROTOCOL_CONTENT_TYPE); 

     return headers; 
    } 

    @Override 
    public byte[] getBody() throws AuthFailureError { 
     if (request == null) { 
      return super.getBody(); 
     } 
     return request.toByteArray(); 
    } 


    @Override 
    protected Response<RespT> parseNetworkResponse(NetworkResponse response) { 
     try { 
      if (responseType == null) { 
       throw new IllegalArgumentException("The response type was never provided."); 
      } 
       RespT responseInstance = responseType.newInstance(); 
       return (Response<RespT>) Response.success(
        responseInstance.newBuilderForType().mergeFrom(response.data).build(), 
         HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    public String getBodyContentType() { 
     return PROTOCOL_CONTENT_TYPE; 
    } 

    @Override 
    public RetryPolicy getRetryPolicy() { 
     RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
     return retryPolicy; 
    } 

    @Override 
    protected void deliverResponse(RespT response) { 
     listener.onResponse(response); 
    } 
} 
0

От: cmcneil Добавлено кода в случае, если ссылка гнили. Должна быть официальная реализация Volley или Protocol Buffers, поэтому, пожалуйста, обновите это, когда это необходимо.

import com.android.volley.AuthFailureError; 
import com.android.volley.DefaultRetryPolicy; 
import com.android.volley.NetworkResponse; 
import com.android.volley.ParseError; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.Response.Listener; 
import com.android.volley.RetryPolicy; 
import com.android.volley.toolbox.HttpHeaderParser; 
import com.google.protobuf.MessageLite; 

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by [email protected] on 5/10/15. 
*/ 
public class ProtoBufRequest<ReqT extends MessageLite, RespT extends MessageLite> extends Request<RespT> { 

    private ReqT request; 
    private final Class<RespT> responseType; 
    private final Listener<RespT> listener; 
    private static final String PROTOCOL_CONTENT_TYPE = "application/x-protobuf"; 
    private static final int SOCKET_TIMEOUT = 30000; 

    public ProtoBufRequest(int method, String url, ReqT data, Class<RespT> responseType, 
          Listener<RespT> listener, Response.ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.listener = listener; 
     this.request = data; 
     this.responseType = responseType; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> headers = new HashMap<String, String>(); 
     headers.put("Charset", "UTF-8"); 
     headers.put("Content-Type", PROTOCOL_CONTENT_TYPE); 
     headers.put("Accept", PROTOCOL_CONTENT_TYPE); 

     return headers; 
    } 

    @Override 
    public byte[] getBody() throws AuthFailureError { 
     if (request == null) { 
      return super.getBody(); 
     } 
     return request.toByteArray(); 
    } 


    @Override 
    protected Response<RespT> parseNetworkResponse(NetworkResponse response) { 
     try { 
      if (responseType == null) { 
       throw new IllegalArgumentException("The response type was never provided."); 
      } 
       RespT responseInstance = responseType.newInstance(); 
       return (Response<RespT>) Response.success(
         responseInstance.newBuilderForType().mergeFrom(response.data).build(), 
         HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    public String getBodyContentType() { 
     return PROTOCOL_CONTENT_TYPE; 
    } 

    @Override 
    public RetryPolicy getRetryPolicy() { 
     RetryPolicy retryPolicy = new DefaultRetryPolicy(SOCKET_TIMEOUT, 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
     return retryPolicy; 
    } 

    @Override 
    protected void deliverResponse(RespT response) { 
     listener.onResponse(response); 
    } 
}