免责声明:我昨天刚学会了怎么做,我非常绝望。
我有三个类(Student,ClassSchedule,ClassEnrolment)
public class ClassEnrolment {
ClassSchedule cs;
Student stud;
public ClassEnrolment(ClassSchedule cs, Student stud) {
super();
this.cs = cs;
this.stud = stud;
}
}
-----
public class Student{
private String name;
private String matricNo;
ClassEnrolment classroom;
ClassSchedule schedule;
}
-----
public class ClassSchedule {
String classType;
int index;
int group;
String day;
String time;
String venue;
String remark;
String courseCode;
} 我正在尝试读/写一个文本文件(数据库)。我在"/////////////////"中有3行的问题。
我知道在ClassEnrolment中声明的属性不是int或string。我该怎么做?如何将ClassSchedule和Student作为StringTokenizer的一部分
文本文件存储来自ClassSchedule的索引和从Student存储的matricNo。我有一种感觉,我做错了。
public static ArrayList readEnrolment(String filename) throws IOException {
ArrayList stringArray = (ArrayList) read(filename);
ArrayList alr = new ArrayList();
for (int i = 0; i < stringArray.size(); i++) {
String st = (String) stringArray.get(i);
StringTokenizer star = new StringTokenizer(st, SEPARATOR);
///////////////////////////////////////////////////
int cs = Integer.parseInt(star.nextToken().trim());
String stud = star.nextToken().trim();
ClassEnrolment enrolment = new ClassEnrolment(cs, stud);
//////////////////////////////////////////////////
alr.add(enrolment);
}
return alr;
}
public static void saveEnrolment(String filename, List al) throws IOException {
List alw = new ArrayList();
for (int i = 0; i < al.size(); i++) {
ClassEnrolment enrolment = (ClassEnrolment) al.get(i);
StringBuilder st = new StringBuilder();
st.append(enrolment.getCs2());
st.append(SEPARATOR);
st.append(enrolment.getStud2());
alw.add(st.toString());
}
write(filename, alw);
}发布于 2017-03-31 12:27:32
这里的问题是Serialization的问题。您可以很好地将您的classEnrolment声明为Serializable(不要忘记serialUUID),并让经典的serialUUID序列化过程将对象作为字节写入您的文件中。
但是,您在这里尝试的是为您的类设想一个自定义序列化程序。我建议您在以下方面使用泛型:
public interface Serializer<T> {
byte[] write(T objectToSerialize);
//to build a factory/service around it
boolean canDeserialize(byte[] serializedObject);
T read(byte[] serializedObject);
}这样,您的方法就可以简单地创建一个Serializer<ClassEnrollment>并让它完成它的工作(这可能会创建一个Serializer<Student>和一个Serializer<ClassSchedule>)。
关于序列化过程,我不得不说,StringTokenizer是JDK 1的遗留类,它的使用被它自己的javadoc阻止:
StringTokenizer是一个遗留类,由于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人使用String的拆分方法或java.util.regex包。
如果您想序列化具有潜在不同类的对象,而不仅仅是您的ClassEnrollment,那么最好能够区分所使用的类。有很多方法可以做到这一点,正如一位评论者所言,json序列化的效果会很好。
https://stackoverflow.com/questions/43139459
复制相似问题