在实现serializable接口作用时,什么是显示和隐式uid

如何将一个未实现Serializable接口的对象序列化到本地-java-电脑编程网如何将一个未实现Serializable接口的对象序列化到本地作者:smile080 和相关&&问题如题目所示,《如何将一个未实现Serializable接口的对象序列化到本地》,还请各位大虾多多指点------回答---------------其他回答(20分)---------写个子类实现Serializable其实没什么好实现的,就是个符号
------回答---------------其他回答(20分)---------
写个子类实现Serializable其实没什么好实现的,就是个符号
相关资料:|||||||如何将一个未实现Serializable接口的对象序列化到本地来源网络,如有侵权请告知,即处理!编程Tags:                &                    Java(10)
Android(25)
& 在网络传输Java对象、将Java对象存储到文件、将Java对象以BLOB形式存储到数据库中时,需要对Java对象进行序列化及反序列化,标准模式是实现Serializable接口。&
&& 实现上述接口时,需要提供一个Serial Version UID,该UID用于标识类的版本。一个对象被序列化后,只要其版本不变,都可以进行反序列化,一旦&
改变造成版本不一致,会抛出InvalidClassException异常。&
&& 建议显示定义UID,如果不显示定义,JVM会自动产生一个值,这个值和编译器的实现有关,不稳定,可能在不同JVM环境下出现反序列化抛出InvalidClassException异常的情况。&
&& 在Eclipse中,提供两种方式显示定义UID,一种是“add default serial version ID”,默认值为1L;另一种是“add generated serial version ID”,默认值是一个很大的数,是根据&
类的具体属性而生成,当类属性有变动时,该值会更改。&
&& 建议采用第一种自动生成方法,当对类进行了不兼容性修改时,需要修改UID。&
&& 采用第二种方法时,如果修改了属性,不重新生成UID时,默认值是不会变的,也可以正常反序列化,但不推荐,毕竟UID的值与实际不符。&
&& 对类进行兼容性和不兼容性修改的情况请参见以下url:/javase/7/docs/platform/serialization/spec/version.html。&
&& Hibernate的pojo类建议也采用上述方法,便于扩展。&
&& 对于继承关系,父类实现序列化接口,子类可以继承接口的实现,但需显示定义UID,因为父类UID类型为private static,不可被继承,同时子类作为单独的类需要单独的UID。&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7235次
排名:千里之外
原创:16篇
转载:19篇
(1)(4)(3)(11)(5)(1)(2)(1)(1)(2)(5)(1)1861人阅读
Java 规定的内部机制,实现 Serializable 接口就行了,这个接口只是个标记性的接口,表示类的设计者已经允许这个类型的对象被序列化写入磁盘或通过网络发送,对于有保密要求的东西一般不实现这个接口防止无意间复制到 jvm 内存之外。如果一个类型的多数字段可以复制但个别字段不用复制(比如,它实际上是通过其它字段计算出来的),我们可以把它标记为 transient。
默认的 serialization 对类的结构有要求,一般将来版本升级了导致服务端和客户版本不一样,或者你用新版本读取一个以前旧版本写入磁盘的序列化的对象的话,需要这两个版本是兼容的,达到这个要求至少包括下面这个字段,并且新旧两个版本的类中它的值应该是一样的,其它特殊情况规范也有办法做到,比如你的结构变了,以前 name / phone 都是 A 的字段,后来新版本创建了一个内部类叫 Contact 把 name 和 phone&&
&并到这两个字段移到内部类 Contact 中去了的话,Java 也有办法在新版本中提供自定义 readObject/writeObject 这个过程来确保兼容旧版本。
private static final long serialVersionUID; // 在一个类的多个版本中要相同的值,对于不它的类中,它们的值不要求唯一。
/developer/technicalArticles/Programming/serialization/
serialVersionUID作用:  序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。  有两种生成方式:  一个是默认的1L,比如:private
static final long se...&
  serialVersionUID作用:&
  序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。&
  有两种生成方式:&
  一个是默认的1L,比如:private static final long serialVersionUID = 1L;&
  一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:&
 private static final long serialVersionUID = xxxxL;&
  当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个&
  提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会&
  自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也&
  可以把它关掉的,设置如下:&
 Window ==& Preferences ==& Java ==& Compiler ==& Error/Warnings ==&&
 Potential programming problems&
  将Serializable class without serialVersionUID的warning改成ignore即可。&
  如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable向后兼容。&
  如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。&
  但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2712次
排名:千里之外序列化是什么?
  序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。序列化分为两大部分:序列化和反序列化。
序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。
反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例
什么时候使用序列化: 
对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
序列化的特点:
如果某个类能够被序列化,其子类也可以被序列化。如果该类有父类,则分两种情况来考虑,如果该父类已经实现了可序列化接口。则其父类的相应字段及属性的处理和该类相同;如果该类的父类没有实现可序列化接口,则该类的父类所有的字段属性将不会序列化。 (2)声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据;
相关的类和接口:在java.io包中提供的涉及对象的序列化的类与接口有ObjectOutput接口、ObjectOutputStream类、ObjectInput接口、ObjectInputStream类。
ObjectOutput接口:它继承DataOutput接口并且支持对象的序列化,其内的writeObject()方法实现存储一个对象。ObjectInput接口:它继承DataInput接口并且支持对象的序列化,其内的readObject()方法实现读取一个对象。
ObjectOutputStream类:它继承OutputStream类并且实现ObjectOutput接口。利用该类来实现将对象存储(调用ObjectOutput接口中的writeObject()方法)。ObjectInputStream类:它继承InputStream类并且实现ObjectInput接口。利用该类来实现读取一个对象(调用ObjectInput接口中的readObject()方法)。
  对于父类的处理,如果父类没有实现序列化接口,则其必须有默认的构造函数(即没有参数的构造函数)。否则编译的时候就会报错。在反序列化的时候,默认构造函数会被调用。但是若把父类标记为可以序列化,则在反序列化的时候,其默认构造函数不会被调用。这是为什么呢?这是因为Java 对序列化的对象进行反序列化的时候,直接从流里获取其对象数据来生成一个对象实例,而不是通过其构造函数来完成。
import java.io.FileInputS
import java.io.FileOutputS
import java.io.ObjectInputS
import java.io.ObjectOutputS
import java.io.S
* Author: Leo Sun
* Blog: http://kaffa.im/
* Date: Aug 12, 2014
public class SerializableDemo {
public static void main(String[] args) {
Cat cat = new Cat();
FileOutputStream fos = new FileOutputStream("catDemo.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(" 1& " + cat.getName());
cat.setName("My Cat");
oos.writeObject(cat);
oos.close();
} catch (Exception ex) {
ex.printStackTrace();
FileInputStream fis = new FileInputStream("catDemo.out");
ObjectInputStream ois = new ObjectInputStream(fis);
cat = (Cat) ois.readObject();
System.out.println(" 2& " + cat.getName());
ois.close();
} catch (Exception ex) {
ex.printStackTrace();
class Cat implements Serializable {
private static final long serialVersionUID = -3910122L;
public Cat() {
this.name = "new cat";
public String getName() {
return this.
public void setName(String name) {
this.name =
注:writeObject和readObject本身就是线程安全的,传输过程中是不允许被并发访问的。所以对象能一个一个接连不断的传过来
阅读(...) 评论()I found out that some classes use the [Serializable] attribute.
What is it?
When should I use it?
What kinds of benefits will I get?
解决方案 What is it?
When you create an object in a .Net framework application, you don't need to think about how the data is stored in memory. Because .Net framework takes care of that for you. However, if you want to store the contents of an object to a file, send an object to another process or transmit it across the network, you do have to think about how the object is represented because you will need to convert it to a different format. This conversion is called SERIALIZATION.
Uses for Serialization
Serialization allows the developer to save the state of an object and recreate it as needed, providing storage of objects as well as data exchange. Through serialization, a developer can perform actions like sending the object to a remote application by means of a Web Service, passing an object from one domain to another, passing an object through a firewall as an XML string, or maintaining security or user-specific information across applications.
attribute to a type to indicate that instances of this type can be serialized. Apply the
attribute even if the class also implements the
interface to control the serialization process.
All the public and private fields in a type that are marked by the
are serialized by default, unless the type implements the
interface to override the serialization process. The default serialization process excludes fields that are marked with the
attribute. If a field of a serializable type contains a pointer, a handle, or some other data structure that is specific to a particular environment, and cannot be meaningfully reconstituted in a different environment, then you might want to apply the
attribute to that field.
for more details.
本文地址: &
我发现了一些类使用 [Serializable接口] 属性。这是什么? 我什么时候应该使用它? 我会得到什么样的好处? 解决方案 这是什么?当您创建.NET Framework应用程序的对象,你不需要考虑数据是如何存储在内存中。由于Net框架需要照顾你们。但是,如果要存储一个对象到一个文件中的内容,发送对象到另一个进程或通过网络发送它,你必须思考的对象是如何重新presented,因为你将需要转换它为不同的格式。这种转换被称为序列化。使用序列化序列允许开发者保存对象的状态,并根据需要重新创建它,提供对象的存储以及数据交换。通过系列化,开发人员可以像Web服务的方式发送对象到远程应用程序,传递对象从一个域到另一个,传递对象通过防火墙作为XML字符串,或维护安全或用户特定的执行操作跨应用程序的信息。 应用SerializableAttribute属性类型以指示此类型的实例可以被序列化。应用SerializableAttribute属性,即使该类还实现了ISerializable接口来控制序列化进程。在一个类型的所有公共和私有字段由SerializableAttribute在默认情况下被序列化,除非该类型实现ISerializable接口覆盖序列化进程。默认的序列化进程不包括标有NonSerializedAttribute属性。如果一个序列类型的字段包含一个指向,把手,或一些其它的数据结构,它是专用于一个特定的环境,并且不能在不同的环境中进行有意义的重构,则可能要应用的NonSerializedAttribute归因于该领域。请参阅了解更多详情。
本文地址: &
扫一扫关注官方微信

我要回帖

更多关于 隐式接口 的文章

 

随机推荐