Question

I am trying to get an serialized ArrayList that contains objects from java server, but when I do the deserialization in the android application and error occur.

So I have:

  • ArrayList
  • Each Vote contains an ArrayList
  • Each Choice contains EncryptedInteger object

Vote class

    package entities;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Vote implements Serializable {

    private static final long serialVersionUID = 2L;
    private int voteId;
    private int surveyId;
    private int voterId;
    private List<Choice> choices;
    private boolean counted;


    public Vote(){

    }

    public Vote(int voteId,int surveyId,int voterId, boolean counted){
        this.voteId=voteId;
        this.surveyId=surveyId;
        this.voterId=voterId;
        this.choices = new ArrayList<Choice>();
        this.counted=counted;
    }

    public void addChoice(Choice choice) {
        choices.add(choice);
    }

    public int getVoteId() {
        return voteId;
    }

    public void setVoteId(int voteId) {
        this.voteId = voteId;
    }

    public int getSurveyId() {
        return surveyId;
    }

    public void setSurveyId(int surveyId) {
        this.surveyId = surveyId;
    }

    public int getVoterId() {
        return voterId;
    }

    public void setVoterId(int voterId) {
        this.voterId = voterId;
    }

    public List<Choice> getChoices() {
        return choices;
    }

    public void setChoices(List<Choice> choices) {
        this.choices = choices;
    }

    public boolean isCounted() {
        return counted;
    }

    public void setCounted(boolean counted) {
        this.counted = counted;
    }


}

AND this object contains an arraylist of choices

Choice class

    package entities;

import java.io.Serializable;

import thep.paillier.EncryptedInteger;

public class Choice implements Serializable  {
private static final long serialVersionUID = 2L;
  private EncryptedInteger encryptedInteger;
  private int questionNumber;
  private int optionNumber;
  private double S;


public Choice(EncryptedInteger encryptedInteger, int questionNumber,
        int optionNumber, double s) {

    this.encryptedInteger = encryptedInteger;
    this.questionNumber = questionNumber;
    this.optionNumber = optionNumber;
    S = s;
}
public EncryptedInteger getEncryptedInteger() {
    return encryptedInteger;
}
public void setEncryptedInteger(EncryptedInteger encryptedInteger) {
    this.encryptedInteger = encryptedInteger;
}
public int getQuestionNumber() {
    return questionNumber;
}
public void setQuestionNumber(int questionNumber) {
    this.questionNumber = questionNumber;
}
public int getOptionNumber() {
    return optionNumber;
}
public void setOptionNumber(int optionNumber) {
    this.optionNumber = optionNumber;
}
public double getS() {
    return S;
}
public void setS(double s) {
    S = s;
}

}

The code the will create the arraylist

@Path("/vote")
public class GenerateNumberRequest {

    @POST
    @Path("/GNA")
    @Consumes("application/x-www-form-urlencoded")
    public Response GNApost(MultivaluedMap<String, String> form,
            @Context HttpServletResponse httpResponse) {
        int voteId = Integer.parseInt(form.getFirst("voteId"));
        String generateNumberAuthenticator = form
                .getFirst("generateNumberAuthenticator");

        SurveyKey key = null;
        VoteAuthenticator authenticator = null;
        VoterVerifierRepository voterVerifierRepository = new VoterVerifierRepository();
        VoteAuthenticatorRepository voteAuthenticatorRepository = new VoteAuthenticatorRepository();
        SurveyKeyRepository surveyKeyRepository = new SurveyKeyRepository();
        try {
            authenticator = voteAuthenticatorRepository
                    .getVoteAuthenticator(voteId);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        int surveyId = authenticator.getSurveyId();
        SurveyCommunication surveyCommunication = new SurveyCommunication(
                surveyId);

        Survey survey = surveyCommunication.getSurvey();
        try {
            key = surveyKeyRepository.getSurveyKey(surveyId);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        List<Vote> votes = new ArrayList<Vote>();

        Vote voteZero = new Vote(authenticator.getVoteId(),
                authenticator.getSurveyId(), authenticator.getVoterId(), false);
        Vote voteOne = new Vote(authenticator.getVoteId(),
                authenticator.getSurveyId(), authenticator.getVoterId(), false);
        Random random = new Random();
        double s1, s2, s3;
        PublicKey publicKey = key.getPublicKey();
        EncryptedInteger encryptedZero = null;
        EncryptedInteger encryptedOne = null;
        for (Question q : survey.getAllQuestions()) {
            for (Option o : q.getOptions()) {
                s1 = random.nextInt() % 10000;
                s2 = -(s1 * key.getX()) / key.getY();
                s3 = (1 - (s1 * key.getX())) / key.getY();

                try {
                    encryptedZero = new EncryptedInteger(BigInteger.ZERO,
                            publicKey);
                    encryptedOne = new EncryptedInteger(BigInteger.ONE,
                            publicKey);
                } catch (BigIntegerClassNotValid e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                voteZero.addChoice(new Choice(encryptedZero, q.getqID(), o
                        .getOptionNumaricalValue(), s2));
                voteOne.addChoice(new Choice(encryptedOne, q.getqID(), o
                        .getOptionNumaricalValue(), s3));
            }
        }

        votes.add(voteZero);
        votes.add(voteOne);

        ByteArrayOutputStream b = new ByteArrayOutputStream();
        ObjectOutputStream o;
        try {
            o = new ObjectOutputStream(b);
            o.writeObject(votes);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return Response.status(200).entity(b.toByteArray()).build();

    }
}

android code

    package com.example.connection;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

import entities.Vote;

public class GenerateNumberConnection {

    static HttpClient httpClient;
    static HttpPost httpPost;
    static HttpResponse response;

    @SuppressWarnings("unchecked")
    public static List<Vote> getVotes(String voteId, String GNA) {
        httpClient = HttpObjects.getHttpClient();
        httpPost = new HttpPost(
                "http://192.168.100.4:8181/trustee/APP/vote/GNA");

        List<Vote> votes = null;
        ArrayList<NameValuePair> postParameters;

        postParameters = new ArrayList<NameValuePair>();
        postParameters.add(new BasicNameValuePair("voteId", voteId));
        postParameters.add(new BasicNameValuePair(
                "generateNumberAuthenticator", GNA));

        try {
            httpPost.setEntity(new UrlEncodedFormEntity(postParameters));
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            byte[] responseByte = null;
            responseByte = EntityUtils.toByteArray(entity);
            ByteArrayInputStream in = new ByteArrayInputStream(responseByte);
            ObjectInputStream is = new ObjectInputStream(in);
            votes = (List<Vote>) is.readObject();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return votes;
    }
}

The trace of the code

05-02 09:58:50.248: W/System.err(934): java.lang.ClassNotFoundException: sun.security.provider.Sun
05-02 09:58:50.248: W/System.err(934):  at java.lang.Class.classForName(Native Method)
05-02 09:58:50.248: W/System.err(934):  at java.lang.Class.forName(Class.java:251)
05-02 09:58:50.248: W/System.err(934):  at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2262)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1638)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:658)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1781)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347)
05-02 09:58:50.268: W/System.err(934):  at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244)
05-02 09:58:50.278: W/System.err(934):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833)
05-02 09:58:50.278: W/System.err(934):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
05-02 09:58:50.278: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
05-02 09:58:50.278: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
05-02 09:58:50.278: W/System.err(934):  at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115)
05-02 09:58:50.288: W/System.err(934):  at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455)
05-02 09:58:50.288: W/System.err(934):  at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347)
05-02 09:58:50.288: W/System.err(934):  at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244)
05-02 09:58:50.298: W/System.err(934):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833)
05-02 09:58:50.298: W/System.err(934):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
05-02 09:58:50.298: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
05-02 09:58:50.298: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
05-02 09:58:50.298: W/System.err(934):  at java.util.ArrayList.readObject(ArrayList.java:661)
05-02 09:58:50.298: W/System.err(934):  at java.lang.reflect.Method.invokeNative(Native Method)
05-02 09:58:50.298: W/System.err(934):  at java.lang.reflect.Method.invoke(Method.java:515)
05-02 09:58:50.298: W/System.err(934):  at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1332)
05-02 09:58:50.298: W/System.err(934):  at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244)
05-02 09:58:50.298: W/System.err(934):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833)
05-02 09:58:50.308: W/System.err(934):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
05-02 09:58:50.308: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
05-02 09:58:50.318: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
05-02 09:58:50.318: W/System.err(934):  at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1115)
05-02 09:58:50.318: W/System.err(934):  at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455)
05-02 09:58:50.318: W/System.err(934):  at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1347)
05-02 09:58:50.318: W/System.err(934):  at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244)
05-02 09:58:50.328: W/System.err(934):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833)
05-02 09:58:50.328: W/System.err(934):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
05-02 09:58:50.348: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
05-02 09:58:50.348: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
05-02 09:58:50.348: W/System.err(934):  at java.util.ArrayList.readObject(ArrayList.java:661)
05-02 09:58:50.348: W/System.err(934):  at java.lang.reflect.Method.invokeNative(Native Method)
05-02 09:58:50.348: W/System.err(934):  at java.lang.reflect.Method.invoke(Method.java:515)
05-02 09:58:50.348: W/System.err(934):  at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1332)
05-02 09:58:50.348: W/System.err(934):  at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1244)
05-02 09:58:50.358: W/System.err(934):  at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1833)
05-02 09:58:50.358: W/System.err(934):  at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762)
05-02 09:58:50.358: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
05-02 09:58:50.358: W/System.err(934):  at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
05-02 09:58:50.358: W/System.err(934):  at com.example.connection.GenerateNumberConnection.getVotes(GenerateNumberConnection.java:57)
05-02 09:58:50.358: W/System.err(934):  at com.example.elections.PagesValue.readWebServices(PagesValue.java:396)
05-02 09:58:50.358: W/System.err(934):  at com.example.elections.PagesValue$8.onClick(PagesValue.java:265)
05-02 09:58:50.358: W/System.err(934):  at android.view.View.performClick(View.java:4438)
05-02 09:58:50.358: W/System.err(934):  at android.view.View$PerformClick.run(View.java:18422)
05-02 09:58:50.358: W/System.err(934):  at android.os.Handler.handleCallback(Handler.java:733)
05-02 09:58:50.358: W/System.err(934):  at android.os.Handler.dispatchMessage(Handler.java:95)
05-02 09:58:50.358: W/System.err(934):  at android.os.Looper.loop(Looper.java:136)
05-02 09:58:50.358: W/System.err(934):  at android.app.ActivityThread.main(ActivityThread.java:5017)
05-02 09:58:50.358: W/System.err(934):  at java.lang.reflect.Method.invokeNative(Native Method)
05-02 09:58:50.358: W/System.err(934):  at java.lang.reflect.Method.invoke(Method.java:515)
05-02 09:58:50.358: W/System.err(934):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-02 09:58:50.358: W/System.err(934):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-02 09:58:50.368: W/System.err(934):  at dalvik.system.NativeStart.main(Native Method)
05-02 09:58:50.368: W/System.err(934): Caused by: java.lang.NoClassDefFoundError: sun/security/provider/Sun
05-02 09:58:50.368: W/System.err(934):  ... 73 more
05-02 09:58:50.368: W/System.err(934): Caused by: java.lang.ClassNotFoundException: Didn't find class "sun.security.provider.Sun" on path: DexPathList[[zip file "/data/app/com.example.elections-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.elections-1, /system/lib]]
05-02 09:58:50.388: W/System.err(934):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
05-02 09:58:50.388: W/System.err(934):  at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
05-02 09:58:50.388: W/System.err(934):  at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
05-02 09:58:50.388: W/System.err(934):  ... 73 more
05-02 09:58:50.758: D/AndroidRuntime(934): Shutting down VM
05-02 09:58:50.758: W/dalvikvm(934): threadid=1: thread exiting with uncaught exception (group=0xb1a39ba8)
05-02 09:58:50.808: E/AndroidRuntime(934): FATAL EXCEPTION: main
05-02 09:58:50.808: E/AndroidRuntime(934): Process: com.example.elections, PID: 934
05-02 09:58:50.808: E/AndroidRuntime(934): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.elections/com.example.elections.HomePage}: java.lang.NullPointerException
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.ActivityThread.access$800(ActivityThread.java:135)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.os.Handler.dispatchMessage(Handler.java:102)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.os.Looper.loop(Looper.java:136)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.ActivityThread.main(ActivityThread.java:5017)
05-02 09:58:50.808: E/AndroidRuntime(934):  at java.lang.reflect.Method.invokeNative(Native Method)
05-02 09:58:50.808: E/AndroidRuntime(934):  at java.lang.reflect.Method.invoke(Method.java:515)
05-02 09:58:50.808: E/AndroidRuntime(934):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-02 09:58:50.808: E/AndroidRuntime(934):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-02 09:58:50.808: E/AndroidRuntime(934):  at dalvik.system.NativeStart.main(Native Method)
05-02 09:58:50.808: E/AndroidRuntime(934): Caused by: java.lang.NullPointerException
05-02 09:58:50.808: E/AndroidRuntime(934):  at com.example.elections.HomePage.onCreate(HomePage.java:53)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.Activity.performCreate(Activity.java:5231)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
05-02 09:58:50.808: E/AndroidRuntime(934):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
05-02 09:58:50.808: E/AndroidRuntime(934):  ... 11 more
05-02 09:58:55.218: D/gralloc_goldfish(1074): Emulator without GPU emulation detected.
05-02 10:00:31.428: D/dalvikvm(1074): GC_FOR_ALLOC freed 139K, 6% free 3246K/3452K, paused 30ms, total 37ms

I spent a lot of time searching, but I didn't find anything.

Edit one:

The EncryptedInteger class here

Était-ce utile?

La solution

I'm guessing that the EncryptedInteger instance points to an instance of sun.security.provider.Sun. Since sun.security.provider.Sun is not in your Android application's classpath, it has no idea how to de-serialize it and blows up.

My bets are that it's the SecureRandom in EncryptedInteger.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top