Last.fm java.lang.ClassCastException - чтение пользовательских объектов из файла

Я был бы очень признателен, если бы кто-нибудь мог помочь мне с этой проблемой. Я получаю сообщение об ошибке при запуске этого класса UniqueUsersData.java

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.util.HashSet
    at gettingData.UniqueUsersData.main(UniqueUsersData.java:30)

УникальныеПользователиДанные.java:

package gettingData;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.io.Serializable;

import de.umass.lastfm.User;

public class UniqueUsersData {

public static void main(String[] args) throws IOException, ClassNotFoundException{

    HashSet<User> userData = null;
    String fileName = "users.csv";
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));

    try{
        while(in != null ){ // keep reading if there are more lines in the file
        userData = (HashSet<User>) in.readObject();
        }
    }catch(IOException e){
      e.printStackTrace();
    }

    String file = "usersInfo.csv";

    BufferedWriter out = new BufferedWriter(new FileWriter(file, true));

    for(User u: userData){
        System.out.println(u.getId() + "," +  u.getName() + "\n");
    }

    out.close();

} // end main method

} // end class

У меня есть другой класс, который получает данные с помощью API last.fm, сохраняет объекты пользователя в массиве, а затем записывает эти объекты в файл (users.csv). Все работает нормально, и я пишу в файл, используя ObjectOutputStream.

Я читал о том, что класс должен быть Serializable, но я предполагаю, что de.umass.lastfm.User его не реализует.

Есть ли что-то, что мне здесь не хватает?

Спасибо за любую помощь!


person user2886192    schedule 03.12.2013    source источник


Ответы (2)


in.readObject() возвращает строку, и вы выполняете приведение к HashMap. Вот почему вы получили ClassCastException. Вам может потребоваться записать данные пользователя (поле пользователя) в формате String (могут быть значения, разделенные запятыми), затем вы можете прочитать их как строку, разделить запятой и назначить их объектам пользователя построчно.

person Abimaran Kugathasan    schedule 03.12.2013

Вы получаете исключение, поскольку данные в файле users.csv хранятся в виде строки, тогда как вы пытаетесь преобразовать (преобразовать) ее в HashSet . В общем случае метод readObject() возвращает объект, который может быть приведен к тому же типу данных, который был сериализован. Пожалуйста, проверьте, какой объект был добавлен в файл users.csv. Был ли это ArrayList или что-то еще.

Примечание. Пользовательские объекты не могут быть сохранены в файле, если он не поддерживает сериализацию, вы получите исключение java.io.NotSerializableException.

В приведенном ниже коде показан пример чтения и записи пользователем с некоторыми изменениями.

User.java

package de.umass.lastfm;

import java.io.Serializable;

public class User implements Serializable{

private static final long serialVersionUID = 1L;

private String id;
private String name;
/**
 * @return the id
 */
public String getId() {
    return id;
}
/**
 * @param id the id to set
 */
public void setId(String id) {
    this.id = id;
}
/**
 * @return the name
 */
public String getName() {
    return name;
}
/**
 * @param name the name to set
 */
public void setName(String name) {
    this.name = name;
}
}

UniqueUsersData.java

package de.umass.lastfm;

import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;


public class UniqueUsersData {

public static void main(String[] args) throws IOException, ClassNotFoundException{

    //populating user object in arraylist STARTS
    User user1 = new User();
    user1.setId("1");
    user1.setName("name1");

    User user2 = new User();
    user2.setId("2");
    user2.setName("name2");

    List<User> userList = new ArrayList<User>();
    userList.add(user1);
    userList.add(user2);
    //populating user object in arraylist ENDS

    // Add ArrayList<User> to file users.csv STARTS
    try{

        FileOutputStream fout = new FileOutputStream("users.csv");
        ObjectOutputStream oos = new ObjectOutputStream(fout);   
        oos.writeObject(userList);
        oos.close();
        System.out.println("file added users.csv");

       }catch(Exception ex){
           ex.printStackTrace();
       }
    // Add ArrayList<User> to file users.csv ENDS

    // Reading ArrayList<User> from file users.csv STARTS
    ArrayList<User> userData = null;
    String fileName = "users.csv";
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));

    try{
    userData = (ArrayList<User>) in.readObject();
    }catch(IOException e){
      e.printStackTrace();
    } finally {
    in.close();
    }

    String file = "usersInfo.csv";

    BufferedWriter out = new BufferedWriter(new FileWriter(file, true));

    for(User u: userData){
    System.out.println(u.getId() + "," +  u.getName() + "\n");
    }

    out.close();

} // end main method

} // end class
person Kaushal    schedule 03.12.2013
comment
Да, мой файл users.csv должен содержать строки, а не объекты. User.java - это сторонний класс. Есть ли способ сделать его сериализуемым? В идеале я мог бы хранить объекты пользователей и узнавать больше информации о пользователях на основе объектов в файле users.csv. - person user2886192; 03.12.2013
comment
Извините за задержку с ответом... один из способов сериализации класса User - создать новый класс, который является расширением User, и реализовать там Serializable. См.: stackoverflow.com/questions/2114207/ - person Kaushal; 05.12.2013