【问题标题】:Last.fm java.lang.ClassCastException - reading in User objects from fileLast.fm java.lang.ClassCastException - 从文件中读取用户对象
【发布时间】:2013-12-19 22:11:20
【问题描述】:

如果有人能帮助我解决这个问题,我将不胜感激。运行此类 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)

UniqueUsersData.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

我有另一个类,它使用 last.fm api 获取数据,将用户对象存储到 arraylist,然后将这些对象写入文件 (users.csv)。一切正常,我使用ObjectOutputStream 写入文件。

我已经阅读了有关需要为 Serializable 的类的内容,但我假设 de.umass.lastfm.User 没有实现它。

这里有什么我遗漏的吗?

感谢您的帮助!

【问题讨论】:

    标签: java serializable objectinputstream last.fm


    【解决方案1】:

    in.readObject() 返回一个字符串,并且您正在转换为HashMap。这就是为什么你得到ClassCastException。您可能需要以字符串格式(可能是逗号分隔值)写入用户详细信息(用户字段),然后您可以将它们作为字符串读取,用逗号分隔并逐行分配给用户对象。

    【讨论】:

      【解决方案2】:

      您遇到异常,因为文件 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
      

      【讨论】:

      • 是的,我的 users.csv 文件必须包含字符串而不是对象。 User.java 是第三方类 - 有没有办法让它可序列化?理想情况下,我将能够存储用户对象并根据 users.csv 文件中的对象查找有关用户的更多信息。
      • 抱歉延迟响应...序列化 User 类的一种方法是创建一个新类,它是 User 的扩展并在那里实现 Serializable。参考:stackoverflow.com/questions/2114207/…
      猜你喜欢
      • 2011-09-26
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      相关资源
      最近更新 更多