「java类uid」java内部类

博主:adminadmin 2022-11-24 01:39:05 41

今天给各位分享java类uid的知识,其中也会对java内部类进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java中private int uid;public int getUid() {}public void setUid(int uid) {} 与public int uid 的区别

private int uid是类的数据成员

public int getUid()是函数成员,返回值为int类型

public void setUid(int uid)是函数成员,没有返回值

而你的public int uid只是声明一个类型为int的uid变量,属性为public

差不多吧。

java类中serialversionuid 作用 是什么?举个例子说明.

类中影响Serialization进程的特征,两边的操作使用的类版本不同,但它们的 serialVersionUID 必须是一样的。它是用来识别两边的类是否兼容的,两边不同时不应该继续还原状态,而是应该停止下来,因为有人把事情搞错了。如果你的类没有实现 java.io.Serializable 或 java.io.Externalizable,这个字段则没有意义。

如果你没听说过 Java Serialization (序列化,有人书翻译成串行化),那去找些 serialization 介绍看看,下面说的第2段类结构变化时是中级水平的,理解 Java 的一些细节才能理解,多数情况下人们只提到第一种情况(类的结构没有变化时),也只需要第一种情况。

当Serialization两端(比如Socket两端)使用一个类的不同版本时,我们必须提供 serialVersionUID,它可以用JDK自带的 serialver 命令行来计算:

private static final long serialVersionUID = xxxx ;

如果类中出现了下面两个方法,那么将会被用到,否则使用默认的实现:

private void readObject(ObjectInputStream) throws    IOException,ClassNotFoundException;

private void writeObject(ObjectOutputStream)throws  IOException;

记住这里出现的方法和字段都是 private.

新版本中仅增加了字段或方法而没有改变旧版本中已有的东西时,我们只要保证两个版本中的 serialVersionUID 是一样的就行了.

具体样例可以看 JDK 源码中的像 ArrayList 这些类的代码的 readObject 和 writeObject 方法。

类的结构有些变化时,新版本对旧版本中某些东西进行了删减时, Field 的变化我们需要在readObject和writeObject方法中进行处理

ObjectOutputStream.PutField 类可达到这个目的

只是保证两个版本中的 serialVersionUID 一致是行不通的

类中必需两个常量:

private static final long                serialVersionUID;

private static final ObjectStreamField[] serialPersistentFields

下面样例是当客户端和服务端使用的类的版本不同并且类的结构也改变了,比如:

对方使用的类 Entry 是:

public class Entry12 ... {

   private String name, email;

   private static final long serialVersionUID = 12L;

}

现在我们改变了类的设计了:

public class Entry12 ... {

   private EntryInternal basic;

   private static final long serialVersionUID = 12L;

   private class EntryInternal {

         private String name, email;

   }

}

 /*  这是一段代码片段,我们假设新版本的类 name  email 两个字段进行了修改

  * (这里我们放到一个内部类EntryInternal 中),而旧版本中直接属于这个类.

  * 

  *  请注意这里的字段和方法的签名, 它们都是 private 的或者是常量.

  */

public class Entry12 implements Serializable {

  private EntryInternal                    pair                   = new EntryInternal();

  /* 这是必要的,因为版本不同 */

  private static final long                serialVersionUID       = 12L;

  ** 这也是必要的,否则写 putFields 时会抛出异常.

   * This field will be used by {@link #writeObject(ObjectOutputStream)},

   * if this field is missing, follwing exception will be threw when invoke 

   * {@link java.io.ObjectOutputStream.PutField#put(String,)} :

   *   an exception ‘java.lang.IllegalArgumentException: No such object field’  will be threw.

   */

  private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[] {

      new ObjectStreamField("name" , String.class),//

      new ObjectStreamField("email" , String.class),//  

                                                                  };

 /* 我们在这里不是直接写出字段,而把要写出的字段包装起来,

    我们按需交换字段,而不是直接读写pair 这个字段. 

 */

  private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException {

    ObjectInputStream.GetField getFields = input.readFields();

    /* 请注意:使用 Serializable 进行交换时不使用构造方法,所以这时 pair 还未初始化. */

    pair = new EntryInternal();

    pair.name = (String) getFields.get("name", null);

    pair.email = (String) getFields.get("email", null);

  }

  /* 写出时跟读入时一样 */

  private void writeObject(ObjectOutputStream output) throws IOException {

    ObjectOutputStream.PutField putFields = output.putFields();

    putFields.put("name", pair == null ? null : pair.name);

    putFields.put("email", pair == null ? null : pair.email);

    output.writeFields();

  }

  …..

}

java源代码里的序列化uid里的值,那个L是什么意思,解释这个L就可以了,其他我了解过了。

总的来说,serialVersionUID属性相当于Java对象的序列化版本号(类似于人类指纹),编译器会根据这个值来判断能否反序列化,在我们没指定对象的

java类uid的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java内部类、java类uid的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-24,除非注明,否则均为首码项目网原创文章,转载请注明出处。