在国外做h网站怎么样唐山seo优化
本文的参考文章:https://www.cnblogs.com/szlbm/p/5504166.html
平时我们在Java内存中的对象,是无法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即存储对象中的状态。一个Java对象的表示有各种各样的方式,Java本身也提供给了用户一种表示对象的方式,那就是序列化。换句话说,序列化只是表示对 象的一种方式而已。
序列化:将一个对象转换成一串二进制表示的字节数组,通过保存或转移这些字节数据来达到持久化的目的。
反序列化:将字节数组重新构造成对象。
默认实现序列化的方法:
序列化只需要实现java.io.Serializable接口就可以了。序列化的时候有一个serialVersionUID参数,Java序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。 在进行反序列化,Java虚拟机会把传过来的字节流中的serialVersionUID和本地相应实体类的serialVersionUID进行比较, 如果相同就认为是一致的实体类,可以进行反序列化,否则Java虚拟机会拒绝对这个实体类进行反序列化并抛出异常。
如果实现 java.io.Serializable接口的实体类没有显式定义一个名为serialVersionUID、类型为long的变量时,Java序列化 机制会根据编译的.class文件自动生成一个serialVersionUID,如果.class文件没有变化,那么就算编译再多 次,serialVersionUID也不会变化。
java实现默认的序列化方法就是ObjectOutputStream的defaultWriteObject方法和ObjectInputStream的defaultReadObject方法。
public class SerializableObject implements Serializable
{private static final long serialVersionUID = 1L;private String str0;private transient String str1;private static String str2 = "abc";public SerializableObject(String str0, String str1){this.str0 = str0;this.str1 = str1;}public String getStr0(){return str0;}public String getStr1(){return str1;}
}
public static void main(String[] args) throws Exception
{File file = new File("D:" + File.separator + "s.txt");OutputStream os = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(new SerializableObject("str0", "str1"));oos.close();InputStream is = new FileInputStream(file);ObjectInputStream ois = new ObjectInputStream(is);SerializableObject so = (SerializableObject)ois.readObject();System.out.println("str0 = " + so.getStr0());System.out.println("str1 = " + so.getStr1());ois.close();
}
输出结果为:
str0 = str0
str1 = null
原因是:str1被关键字transient修饰了,所以他并没有被序列化,所以结果为null。
Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化,这一看好像很好理解,就是不被序列化,那么什么情况下,一个对象的某些字段不需要被序列化呢?如果有如下情况,可以考虑使用关键字transient修饰:
1、类中的字段值可以根据其它字段推导出来,如一个长方形类有三个属性:长度、宽度、面积(示例而已,一般不会这样设计),那么在序列化的时候,面积这个属性就没必要被序列化了;
2、看具体业务需求;
其目的主要是节省存储空间。可能还有坏处(有些字段可能需要重新计算,初始化什么的),总的来说,利大于弊。
进行序列化、反序列化时,虚拟机会首先试图调用对象里的writeObject和readObject方法,进行用户自定义的序列化和反序列化。如果没有这 样的方法,那么默认调用的是ObjectOutputStream的defaultWriteObject以及ObjectInputStream的 defaultReadObject方法。换言之,利用自定义的writeObject方法和readObject方法,用户可以自己控制序列化和反序列 化的过程。
具体实现参考文章:https://www.cnblogs.com/szlbm/p/5504166.html
序列化的学习就解释了为什么我在做springboot项目的过程中需要将javabean实现序列化接口Serializable,其目的就是为了对象信息能在网络中传输。
更多参考资料:https://www.cnblogs.com/chenpi/p/6185773.html