在某些情况下,Java序列化将比简单地写入CSV文件更加占用空间,因为它存储额外的元数据以识别类类型。
我通过两个简单的测试程序验证了这种情况。第一个程序将一个int数组写入.csv文件中。
import java.io.*;
public class CSVDemo {
public static void main(String [] args) {
try {
PrintWriter pw = new PrintWriter(new File("dummy.csv"));
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000; i++){
sb.append(1);
sb.append(",");
}
pw.write(sb.toString());
pw.close();
System.out.printf("Data is saved in dummy.csv");
} catch(FileNotFoundException e) {
e.printStackTrace();
}
}
}
第二个例子将一个包含整数数组的对象序列化到.ser文件中。
import java.io.*;
public class SerializeDemo
{
public static void main(String [] args)
{
DummyData dummy = new DummyData();
try {
FileOutputStream fileOut = new FileOutputStream("dummy.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(dummy);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in dummy.ser");
} catch(IOException i) {
i.printStackTrace();
}
}
public static class DummyData implements java.io.Serializable{
int[] data = new int[1000];
public DummyData(){
for(int i = 0; i < 1000; i++){
data[i] = 1;
}
}
}
}
.ser文件占用了4079字节。.csv文件占用了2000字节。当然,这只是您使用情况的简化表述(我将int类型等同于您的Row类型),但总体趋势应该是相同的。
尝试使用更大的数字得到相同结果。使用100000个整数得到.ser文件约为400KB,.csv文件约为200KB。
不过,正如下面的评论指出的那样,如果选择随机整数值,.csv文件实际上会变得更大。
serialVersionUID
不会随每个对象一起传输。它是每个newClassDesc
传输一次,而每个类每个流只传输一次newClassDesc
。 - user207421ObjectOutputStream.writeObject(list)
。 - user207421Socket.close()
是另一个例子。 - user207421