请教达人: 关于序列化和Unicode 本帖最后由 cloudeagle_bupt 于 2013-08-20 16:25:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 package serial;import java.io.*;public class SerialTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Employee e1 = new Employee( " zhangsan " , 25 , 3000.50 ); Employee e2 = new Employee( " lisi " , 24 , 3200.40 ); Employee e3 = new Employee( " wangwu " , 27 , 3800.55 ); FileOutputStream fos = new FileOutputStream("employee.txt"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(e1); oos.writeObject(e2); oos.writeObject(e3); oos.close(); FileInputStream fis = new FileInputStream("employee.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Employee e; for ( int i = 0 ;i < 3 ;i ++ ) { e = (Employee)ois.readObject(); System.out.println(e.name + " : " + e.age + " : " + e.salary); } ois.close(); }}class Employee implements Serializable{ String name; int age; double salary; transient Thread t = new Thread(); public Employee(String name, int age, double salary) { this .name = name; this .age = age; this .salary = salary; } private void writeObject(java.io.ObjectOutputStream oos) throws IOException { oos.writeInt(age); oos.writeUTF(name); System.out.println( " Write Object " ); } private void readObject(java.io.ObjectInputStream ois) throws IOException { age = ois.readInt(); name = ois.readUTF(); System.out.println( " Read Object " ); } }比如这段代码,请问在序列化后写入硬盘上时,是按照什么编码格式呢?是unicode么? 你的问题好奇怪。一般unicode编码是指字符的编码。java对象序列化后,该对象能转换成字节流在网络上传输和存储在硬盘上,在网络上的另一端能接收到字节流并把它转换成原来的对象,存在硬盘上的对象能用ObjectInputStream 读取该对象。 我的理解是: 1. 在内存中Java字符串值的存储方式是unicode,硬盘上存字符的话,可以是unicode编码或者utf8或者其他编码方式。 2. 序列化的话,是将对象转换成字节流在网络间或者进程间传输。可是在传输的时候,字节流也是有自己的2进制编码的吧,这里的编码是unicode么? 还是utf8呢/ 比如在上面的代码中:writeObject是将Employ这个对象自身写入字节流的方法readObject是组装字节流中的被序列化的参数值,e = (Employee)ois.readObject(); 这行就是将读出来的字节流的值强制转换成Employee对象。以上是一种基于字节流的对象的写入和组装。 但是,在字节流传输的过程中,其编码使用的是什么呢? 是unicode么? 请大神给指点下。 你到底知道不知道什么叫编码。字节流都是0101了还有个P的编码。private String abcd = "abcd"才有编码。如果说0101如何变回"abcd"而不是"????",那是你操作系统和jdk的默认编码。 不好意思,确实不懂,请问在序列化的过程中,比如这个函数: private void writeObject(java.io.ObjectOutputStream oos) throws IOException { oos.writeInt(age); // 请问这里将一个整形写入字节流中,这里不知道用什么编码方式写入字节流? oos.writeUTF(name); //这里是将name字符串以utf的编码写入字节流 System.out.println( " Write Object " ); } 请问上面注释的地方理解的对么? 1. Java对象在内存中的形式都是unicode编码么? 和存在硬盘上的有区别么?内存中就是01,硬盘上一般不存对象吧,存的是class。2. Java对象序列化后的二进制编码是什么编码呢? 这个可以自己设置么(比如修改成utf-8)?这个是不可以的,也没什么用, 序列化只是规定个拆分和组装的顺序而已(个人理解)3. unicode和utf系列编码的关系,这个可以百度一下。 非常感谢诸位的指点,重新理解了下,应该是这样的:1. 编码这些应该是针对字符而言的,整形及数值这些是不需要编码的。因此,无论是硬盘中还是内存中,虽然存的都是二进制码,但是字符的编码方式可以是utf9,unicode等等。2. 序列化只是一种将对象写入字节流的方法而已。可以自己去定义对象的拆分和组装,对象中的字符,写入字节流时,可以选择编码方式,其他的数值型的话,可以直接序列化。 求大神们指点,急 java graphics的异或模式向牛人请教 jsp问题!!!! 字符串拆分,输出问题 入门学者?请各位高手帮忙!! 字符串最优匹配_人工智能DP算法 高分求...如何用JAVA实现抽取随机数0到100,并能统计相应的概率 .....急啊 10年编程无师自通 环境变量path classpath autoexec.bat的设置 : 请问IBM Visual Age Java里面,如何调用处在Default Package ...里面的Class? 关于子类重写父类方法的问题 javax.sql.DataSource和java.sql.DriverManager的区别
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub Employee e1 = new Employee( " zhangsan " , 25 , 3000.50 );
Employee e2 = new Employee( " lisi " , 24 , 3200.40 );
Employee e3 = new Employee( " wangwu " , 27 , 3800.55 );
FileOutputStream fos = new FileOutputStream("employee.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(e1);
oos.writeObject(e2);
oos.writeObject(e3);
oos.close();
FileInputStream fis = new FileInputStream("employee.txt");
ObjectInputStream ois = new ObjectInputStream(fis); Employee e;
for ( int i = 0 ;i < 3 ;i ++ )
{
e = (Employee)ois.readObject();
System.out.println(e.name + " : " + e.age + " : " + e.salary);
}
ois.close();
}
}class Employee implements Serializable{
String name;
int age;
double salary;
transient Thread t = new Thread();
public Employee(String name, int age, double salary)
{
this .name = name;
this .age = age;
this .salary = salary;
}
private void writeObject(java.io.ObjectOutputStream oos) throws IOException
{
oos.writeInt(age);
oos.writeUTF(name);
System.out.println( " Write Object " );
}
private void readObject(java.io.ObjectInputStream ois) throws IOException
{
age = ois.readInt();
name = ois.readUTF();
System.out.println( " Read Object " );
}
}
比如这段代码,请问在序列化后写入硬盘上时,是按照什么编码格式呢?
是unicode么?
我的理解是:
1. 在内存中Java字符串值的存储方式是unicode,硬盘上存字符的话,可以是unicode编码或者utf8或者其他编码方式。
2. 序列化的话,是将对象转换成字节流在网络间或者进程间传输。可是在传输的时候,字节流也是有自己的2进制编码的吧,这里的编码是unicode么? 还是utf8呢/
readObject是组装字节流中的被序列化的参数值,e = (Employee)ois.readObject(); 这行就是将读出来的字节流的值强制转换成Employee对象。
以上是一种基于字节流的对象的写入和组装。 但是,在字节流传输的过程中,其编码使用的是什么呢? 是unicode么? 请大神给指点下。
private String abcd = "abcd"才有编码。
如果说0101如何变回"abcd"而不是"????",那是你操作系统和jdk的默认编码。
不好意思,确实不懂,请问在序列化的过程中,比如这个函数:
private void writeObject(java.io.ObjectOutputStream oos) throws IOException
{
oos.writeInt(age); // 请问这里将一个整形写入字节流中,这里不知道用什么编码方式写入字节流?
oos.writeUTF(name); //这里是将name字符串以utf的编码写入字节流
System.out.println( " Write Object " );
} 请问上面注释的地方理解的对么?
内存中就是01,硬盘上一般不存对象吧,存的是class。2. Java对象序列化后的二进制编码是什么编码呢? 这个可以自己设置么(比如修改成utf-8)?
这个是不可以的,也没什么用, 序列化只是规定个拆分和组装的顺序而已(个人理解)3. unicode和utf系列编码的关系,
这个可以百度一下。
非常感谢诸位的指点,重新理解了下,应该是这样的:
1. 编码这些应该是针对字符而言的,整形及数值这些是不需要编码的。因此,无论是硬盘中还是内存中,虽然存的都是二进制码,但是字符的编码方式可以是utf9,unicode等等。2. 序列化只是一种将对象写入字节流的方法而已。可以自己去定义对象的拆分和组装,对象中的字符,写入字节流时,可以选择编码方式,其他的数值型的话,可以直接序列化。