Próbuję zaimplementować niestandardowy serializator gson/deserialiser dla niektórych obiektów BasicNameValuePair.Niestandardowy serializer - deserializator używający GSON do listy BasicNameValuePairs
Widziałem częściowy kod Solution (dla serializacji) tutaj: How do I get Gson to serialize a list of basic name value pairs?
Jednak chciałem realizować również deserializacjia i próbowałem moje szanse i kod jest tutaj:
package dto;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.message.BasicNameValuePair;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
public class KeyValuePairSerializer extends TypeAdapter<List<BasicNameValuePair>> {
@Override
public void write(JsonWriter out, List<BasicNameValuePair> data) throws IOException {
out.beginObject();
for(int i=0; i<data.size();i++){
out.name(data.get(i).getName());
out.value(data.get(i).getValue());
}
out.endObject();
}
@Override
public List<BasicNameValuePair> read(JsonReader in) throws IOException {
ArrayList<BasicNameValuePair> list=new ArrayList<BasicNameValuePair>();
in.beginObject();
while (in.hasNext()) {
String key = in.nextName();
String value = in.nextString();
list.add(new BasicNameValuePair(key,value));
}
in.endObject();
return list;
}
}
Code w celu zainicjowania i wypełnienia listy
ArrayList<BasicNameValuePair> postParameters=new ArrayList<BasicNameValuePair>();
postParameters.add(new BasicNameValuePair("some_key","some_value"));
Tutaj jest kod do korzystania z nowej klasy KeyValuePairSerializer:
GsonBuilder gsonBuilder= new GsonBuilder();
gsonBuilder.registerTypeAdapter(KeyValuePairSerializer.class, new KeyValuePairSerializer());
Gson gson1=gsonBuilder.create();
//serialization works just fine in the next line
String jsonUpdate=gson1.toJson(postParameters, KeyValuePairSerializer.class);
ArrayList<BasicNameValuePair> postParameters2 = new ArrayList<BasicNameValuePair>();
//postParameters2 = gson1.fromJson(jsonUpdate, KeyValuePairSerializer.class); //? how to cast properly
//deserialization throws an error, it can't cast from ArrayList<BasicNameValuePair> to KeyValuePairSerializer
gson1.fromJson(jsonUpdate, KeyValuePairSerializer.class);
Problemem jest to, że zgłasza wyjątek na końcu i nie wiem, gdzie dokładnie jest problem i nadal nie wiem, jak napisać ostatnią linię, aby uzyskać wynik w nowej specyfikacji PostParameters2 ArrayList.
Wykonywanie takich czynności zignoruje moją nową zdefiniowaną klasę KeyValuePairSerializer i nie wywoła metody overriden: read. – Arise
Właściwie to go nie zignoruje, jeśli wywołasz 'registerTypeAdapter()' tak, jak zrobiłeś to w pytaniu. – Nachi
Nie wydaje się, żeby tak było. registerTypeAdapter wydaje się działać tylko dla serializera, a nie dla deserializera. – Arise