对象序列化

Java 源码重读系列之 ConcurrentHashMap HASH_BITS 进行与(&)操作,作用就是保证返回的结果的最高位一定是 0,也就是说,返回的结果一定是正数。但是在扩容期间,有两个状态,一个是 -1,一个是非常大的一个负值。循环里的第一个分支是不需要辅助扩容或者是已经达到最大的辅助线程数量,或者是已经剩最后一个线程在扩容了,其他的线程都结束了。的扩容因子一样,其实 sc 的值就是扩容阈值,这个后面会提到,现在不理解没关系),所以也是大于 0 的。在创建数组的时候捕获了一个异常,这个异常出现的唯一情况就是内存不够了,分配不了 2 倍的 n 的数组。 阅读详情

本文 是学习《深入理解Java7》 的学习笔记

在程序的运行过程中,活动对象的状态保存在内存中。内存中的数据是非持久化的。当虚拟机终止时,内存中对象的信息就会丢失。能够持久化保存对象数据的方式有很多。典型的方式是使用文件系统或数据库。持久化对象时通常涉及自定义存储格式。使用文件存储时可以基于标准的文件格式,如XML、JSON和CSV等,也可以使用自定义的文本或二进制格式。使用数据库存储时需要定义数据库的表结构。定义了存储格式之后,在保存和读取操作时,需要在活动对象的内部状态和存储格式之间互相转换。
从简化实现的角度出发,可以使用Java语言内建的对象持久化方式,即对象序列化(object serialization)机制。对象序列化用来在虚拟机中的活动对象和字节流之间进行转换。

序列化机制通常包括两个过程:

  • 序列化(serialization),把活动对象的内部状态转换成一个字节流,保存操作。
  • 反序列化(deserialization),从一个字节流中得到可以直接使用的Java对象。读取操作。

默认的对象序列化

待序列化的Java类只需实现java.io.Serializable接口即可启用这个功能。Serializable仅是一个标记接口,并不包含任何需要实现的具体方法。实现该接口的目的是声明该Java类的对象是可以被序列化的。对于支持序列化的Java类的对象,可以使用java.io.ObjectOuputStream类和java.io.ObjectInputStream类的对象来完成Java对象与字节流之间的相互转换。
- 待实例化的User类

package serializable;

import java.io.ObjectStreamField;
import java.io.Serializable;

/**
 * writeObject方法的Java对象并没有实现Serializable接口,
 * 那么writeObject方法会抛出java.io.NotSerializableException异常。
 * 在默认的序列化实现中,Java对象中的非静态和非瞬时域都会被自动包括进来,
 *  而与域的可见性声明没有关系。这可能会导致某些不应该出现的域被包含在序
 * 列化之后的字节流中 ,比如密码等隐私信息对应的域,进而造成隐私信息的 泄露,
 * 成为程序中的安全隐患。针对这种情况,一种解决办法是把不希望被序
 * 列化的域声明为瞬时的 ,即使用transient关键词。另外一种做法是添加一 个
 * serialPersistentFields域来声明序列化时要包含的域。
 * private static final ObjectStreamField[] serialPersistentFields
 *  = { new ObjectStreamField("name", String.class) };
 */
public class User implements Serializable {
    private String name;
    private transient String email;
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return this.name;
    }

    public String getEmail() {
        return this.email;
    }
}
  • 写入Java对象的内容到文件中
package serializable;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamField;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 写入Java对象的内容到文件中
 * ObjectOuputStream类是一个Java  I/O库中标准的过滤输出流的实现。
 * 在创建ObjectOuputStream类的对象时 需要提供另外一个OutputStream
 * 类的对象作为实际的输出目的 。
 * 在ObjectOuputStream类中包含一系列以“write”作为名称前缀的方法用于
 * 写入基本类型的值和对象到输出流中 ,其中writeObject方法用于把一个
 * Java对象写入到输出流中。
 */
public class WriteUser {
    private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField(
            "name", String.class) };
    public void write(User user) throws IOException {
        Path path = Paths.get("user.bin");
        try (ObjectOutputStream output = new ObjectOutputStream(
                Files.newOutputStream(path))) {
            output.writeObject(user);
        }
    }
    public static void main(String[] args) throws IOException {
        WriteUser writeUser = new WriteUser();
        User user = new User("Alex", "alex@example.org");
        writeUser.write(user);
    }
}
  • 从文件中读取Java对象
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 对象序列化之后得到的字节流可以通过不同的方式进行分发,比如文件复制或网络传输。
 * 在得到字节流之后,可以通过反序列化方式从字节流中得到Java对象。
 * 反序列化时使用的是与ObjectOuputStream类相对应的ObjectInputStream类。
 * 在创建ObjectInputStream类的对象时需要提供一个InputStream类的对象作为参数。
 * 该InputStream类的对象用于读取包含序列化操作结果的字节流。
 * ObjectInputStream类中包含一系列以“read”作为名称前缀的方法来从输入流中读取其中
 * 包含的基本类型数据 和对象其中readObject方法用于读取一个Java对象。
 * 读取到的Java对象中实例域的值由字节流中保存的值来确定。
 */
public class ReadUser {
    public User readUser() throws ClassNotFoundException, IOException {
        Path path = Paths.get("user.bin");
        try (ObjectInput input = new ObjectInputStream(
                Files.newInputStream(path))) {
            User user = (User) input.readObject();
            return user;
        }
    }
    public static void main(String[] args) throws ClassNotFoundException,
            IOException {
        ReadUser readUser = new ReadUser();
        User user = readUser.readUser();
        System.out.println("user.getName() " + user.getName());
        System.out.println("user.getEmail() " + user.getEmail());
    }
}

自定义对象序列化

默认的对象序列化机制虽然使用简单,但是存在的问题也比较多。其中最重要的问题是默认的序列化机制依赖于Java类的内部实现,而不是公开接口。随着程序的版本更新,公开接口基本上不会发生变化,而内部的实现可能发生很多变化。内部实现的变化会导致旧版本的Java对象序列化之后的字节流无法被重新转换成新版本的Java对象。这与通常的“面向接口编程”的实践方式是相背离的。
为了解决版本更新带来的序列化格式不兼容的问题,需要为Java类定义自己的序列化格式,而不是简单地使用默认格式。
通过在Java类中添加特定的方法来编写自定义的序列化实现逻辑。自定义的序列化逻辑由两个配对的方法来实现,分别是writeObject和readObject方法。

package serializable;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class NewUser implements Serializable {
    /**
     * 可以在writeObject方法和readObject方法中添加比较复杂的逻辑,
     *  包括修改域的值或添加额外的数据等。
     */
    private static final long serialVersionUID = 1L;
    /**
     * 如果在自定义的writeObject方法和readObject方法中对某个域的数据进行了处理,
     * 一般把该域声明为transient,
     * 这样defaultWriteObject方法和defaultReadObject方法就不会处理这个域,
     * 避免默认实现带来的不兼容性问题。
     * 使用该ObjectInputStream类的对象来读取流中的内容,并初始化对象中的
     * 对应实例域。在readObject方法中一般先使用defaultReadObject方法
     */
    private transient int age;

    public NewUser(int age) {
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    private void writeObject(ObjectOutputStream output) throws IOException {
        output.defaultWriteObject();
        output.writeInt(getAge());
    }
//  在writeObject方法中一般先使用defaultWriteObject方法来执行默认的写入操作,
//  即写入非静态和非瞬时的域。这样可以提高代码的灵活性。
    private void readObject(ObjectInputStream input)
            throws ClassNotFoundException, IOException {
        input.defaultReadObject();
        this.age = input.readInt();
        this.age = age;
    }

}

对象替换

  • 需要替换的类
package serializable;

import java.io.Serializable;

/**
 * 对象替换
 * 在进行反序列化操作时,会创建出新的Java对象。从某种意义上来说,反序列化的作用相当于一个构造方法。
 * 有些Java类对于其对象实例有自己的管理逻辑,
 * 例如使用单例模式时
 * ,要求某个类在虚拟机中只有一个实例。对于这样的Java类,在反序列化时,需要对得到的对象进行处理,
 * 以保证序列化机制不会破坏Java类本身的约束
 * ,否则,每进行一次反序列化操作,都会创建一个新的对象,就破坏了单例模式要求的约束条件。
 * 在其他情况下,可能需要在序列化时使用另外一个对象来代替当前对象,
 * 原因可能是当前对象中包含了一些不需要被序列化的域,比如这些域是从另外一个域派生而来的。
 * 对于这种情况,
 * 也可以通过把域声明为transient或使用自定义的writeObject方法和readObject方法来实现
 * 。但是如果这样的逻辑比较复杂,可以考虑封装在一个Java类中
 * 。另外还可以隐藏实际的类层次结构。比如类A中的某个域引用了类B,在正常的序列化过程中,
 * 类A和类B都会出现在序列化之后的字节流中
 * ,如果希望在字节流中隐藏类B,可以用另外一个类的对象来代替类B的对象。
 * 在序列化时进行的对象替换操作由一组对应的writeReplace方法和readResolve方法来完成
 * 。在writeReplace方法中可以根据当前对象创建一个新的对象作为替代
 * 。这个替代对象被写入到ObjectOutputStream类的对象中。同样的,在readResolve方法中
 * ,可以对读取出来的对象进行转换,把转换的结果作为反序列化的结果返回。
 */

public class Order implements Serializable {
    private User user;
    private String id;

    public Order(String id, User user) {
        this.id = id;
        this.user = user;
    }

    public String getId() {
        return id;
    }

    private Object writeReplace() {
        return new OrderTo(this);
    }

}
  • 替换对象的Java类
/**
 * OrderTO类本身使用了默认的序列化格式,只包含OrderTO类中表示订单编号的orderId域的内容。
 *  在调用readResolve方法时,基本的反序列化操作已经完成 ,orderId域已经被初始化为正确的值。
 *  在readResolve方法中通过相关的查找逻辑根据域orderId的值得到对应的Order类的对象 。
 *  把Order类的对象作为readResolve方法的返回值,即反序列化的最终结果。对调用者来说,
 * 替换对象的存在是透明的。
  */
public class OrderTo implements Serializable {
    private String orderId;

    public OrderTo(Order order) {
        this.orderId = order.getId();
    }

    private Object readResolve() throws ObjectStreamException {
        // 替换逻辑
        return null;
    }
}

版本更新

在使用ObjectInputStream类的对象读取一个旧版本的Java对象的序列化结果时,会尝试在当前虚拟机中查找其Java类的定义。如果找不到类的定义,就尝试加载该Java类,被加载的有可能是新版本的Java类。需要一种方式来判断旧版本的序列化内容是否与当前的Java类兼容。如果不兼容,那么读取操作会直接失败。这种兼容性的判断是通过Java类中的全局唯一标识符serialVersionUID来实现的。当Java类实现了Serializable接口时,需要声明该Java类唯一的序列化版本号。这个版本号会被包括在序列化后的字节流中。在进行读取时,会比较从字节流中得到的版本号与对应Java类中声明的版本号是否一致,以确定两者是否兼容。只有在版本一致时,序列化操作才能完成。

安全性

package serializable;

import java.io.IOException;
import java.io.InvalidObjectException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectInputValidation;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;

/**
 * 安全性 1.第一个方面是根据信息隐藏的原则,尽可能地减少序列化结果中包含的信息。 所包含的信息越少,
 * 泄露之后造成的影响就越小。通过自定义的序列化格式和对象替换可以实现这一点。
 * 第二个方面是对包含序列化结果的字节流进行保护。措施主要是加密和解密。可以对序列化
 * 后的字节流的整体使用各种加密算法进行处理。在反序列化之前再使用相应的解密算法进行
 * 处理即可。加密和解密也可以在序列化的过程中进行。在Java类的writeObject方法中,可
 * 以在写入域的值之前,先进行加密操作。在readObject方法中,在读取域的值之后,先进行
 * 解密操作,再赋值给对象中的域。这两种方式可以结合起来形成复杂的加密方案。
 * 3.第三个方面是在从字节流中进行反序列化操作时进行数据完整性验证。在使用ObjectInputStream类的
 * 对象进行读取操作时
 * ,输入字节流的内容有可能已经被篡改  ,因此在Java类的readObject方法中需要添加相应的验证代码来检
 * 查完整性是否被破坏,比如验证域的值是否为null,
 * 以及域的值是否在合理的范围之内等。在readObject方法中的处理适合于对单个Java类的对象进行验证。
 * 要对一个完整的
 * 对象图进行验证,可以通过ObjectInputStream类的registerValidation方法添加
 * java * .io.ObjectInputValidation接口的实现对象,进而添加完整的对象验证逻辑。通常的做法是
 * 在readObject方法中处理
 * 完所有域之后, * 再添加一个ObjectInputValidation接口的实现对象来进行完整的验证。验证通常在
 * 引用关系根节点的Java类的readObject
 * 方法中进行。
 * 
 * * 
 */
public class NewUser2 implements Serializable {
    /**
     * 可以在writeObject方法和readObject方法中添加比较复杂的逻辑, 包括修改域的值或添加额外的数据等。
     */
    private static final long serialVersionUID = 1L;
    /**
     * 如果在自定义的writeObject方法和readObject方法中对某个域的数据进行了处理,一般把该域声明为transient,
     * 这样defaultWriteObject方法和defaultReadObject方法就不会处理这个域,避免默认实现带来的不兼容性问题。
     */
    private transient int age;
    private transient Date birthDate;

    public NewUser2(Date birthDate) {
        this.birthDate = birthDate;
    }

    public int getAge() {
        return dateToAge(birthDate);
    }

    private int dateToAge(Date birthDate2) {
        // //日期转换成年龄
        return 0;
    }

    private void writeObject(ObjectOutputStream output) throws IOException {
        output.defaultWriteObject();
        int age = dateToAge(birthDate);
        output.writeInt(getAge());
    }

    private void readObject(ObjectInputStream input)
            throws ClassNotFoundException, IOException {
        input.defaultReadObject();
        this.age = input.readInt();
        this.birthDate = ageToDate(age);
        input.registerValidation(new UserValidator(this), 0);
    }

    private static class UserValidator implements ObjectInputValidation {
        private NewUser2 user;

        public UserValidator(NewUser2 user) {
            this.user = user;
        }

        @Override
        public void validateObject() throws InvalidObjectException {
            // TODO Auto-generated method stub
            if (user.getAge() < 0) {
                throw new InvalidObjectException("非法的年齡值");
            }
        }

    }

    private Date ageToDate(int age2) {
        // 年龄转换为日期
        return null;
    }

}

使用Externalizable接口

package serializable;

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

/**
 * 实现Externalizable接口的Java类必须具备一个不带参数的公开构造方法。在反序列化的过程中,
 * 如果对象的Java类实现了Externalizable接口,则先调用不带参数的公开构造方法得到一个新的对象,
 * 再在此对象上调用readExternal方法。
 * Java类只需要简单地实现标记接口Serializable就可以使用Java平台提供的默认序列化机制。
 * 如果希望进行自定义的序列化处理,那么可以在Java类中添加writeObject方法和readObject方法。
 * 虽然可以进行自定义,但是完整的序列化过程仍然是由Java平台来控制的,无法修改序列化之后的二进制格式。
 * 如果希望对序列化的过程进行完全的控制,那么可以实现java.io.Externalizable接口。
 * Externalizable接口继承自Serializable接口,包含writeExternal和readExternal两个方法。
 * 在使用ObjectOutputStream类的对象写入Java对象时,如果该对象的Java类实现了Externalizable接口,
 * 则writeExternal方法会被调用;在使用ObjectInputStream类的对象读取Java对象时,
 * 如果实现了Externalizable接口,则readExternal方法会被调用。
 * 方法writeExternal和readExternal的作用类似于自定义序列化操作时使用的writeObject和
 * readObject方法,只不过这两个方法是在Externalizable接口中显式声明的,
 * 更容易被开发人员所理解。
 * 
 * 
 * 
 */
public class ExternalizableUser implements Externalizable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public ExternalizableUser(String name, String email) {
        this.name = name;
        this.email = email;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        // TODO Auto-generated method stub
        out.writeUTF(getName());
        out.writeUTF(getEmail());
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException,
            ClassNotFoundException {
        name = in.readUTF();
        email = in.readUTF();
    }

}
springcloud+nacos+gateway+oauth2小聚会 在微服务工程中,Nacos作为目前主流的注册中心和配置中心,Spring Cloud Gateway作为目前主流的网关,下面引入spring security+oauth2+jwt作为认证和授权中心,进行简单的聊聊。 阅读详情

相关推荐

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码)

本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。

weixin_29231725的博客 1383

JDK8源码解析-深入探索String内部变量(二)

源码解析基于jdk1.8.0_261进行分析,如果各位读者的jdk是该版本之前或之后的,可能与本文有所出入,但终究是一脉相承,万世一系 前言 为了贯穿上下文,在阅读此篇文章之前,推荐各位看客优先看下JDK8源码解析-String-修饰符及接口实现(一) 本次我们要讲的是String类的成员变量,因篇幅教广,构造函数我们放在下一期讲解,本期让大家知晓在java中如果new String() 或者定义一个String类型的常量,jvm在栈,堆及常量池中的使用 ...

聽海的聲音 469

模拟电子课设-半导体直流稳压电源的设计和测试

1、学习直流稳压电源的设计方法; 2、研究直流稳压电源的设计方案; 3、掌握直流稳压电路的调试及主要指标的测试方法。二、设计要求和技术指标 1、设计要求1)、设计一个能输出5V-12V连续可调的直流稳压电源,或±12V的直流稳压电源; 2)、根据设计要求和技术指标设计好电路,选好元件及参数,要求绘出原理图,并用Protel 99SE/DXP画出印制板图; 3)、在万能板或面包板上制作一台直流稳压电源; 4)、测量直流稳压电源的稳压系数; 5)、测量直流稳压电源的内阻; 6)、拟定测试方案和设计步

GJZGRB的博客 1972

java代码审计之反序列化(敏感信息泄露)

前言 在 Java 环境中,允许处于不同受信域的组件进行数据通信,从而出现跨受信边界的数据传输。不要序列 化未加密的敏感数据;不要允许序列化绕过安全管理器。 public class GPSLocation implements Serializable { private double x; // sensitive field private double y; // sensitive...

糖小喵 5123

IPMItool 控制风扇转速

然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。

m0_37970303的博客 5063

三相逆变器LCL滤波设计实战:从αβ转换到dq解耦控制的完整建模流程

本文详细解析了三相逆变器LCL滤波设计中的关键步骤,从αβ转换到dq解耦控制的完整建模流程。重点介绍了dq坐标系下的解耦控制策略,通过Simulink仿真验证模型准确性,并提供谐振峰偏移、解耦不彻底等实际问题的解决方案,助力电力电子工程师提升系统稳定性。

weixin_28678151的博客 230

Java 对象序列化

序列化作用: 提供一种简单又可扩展的对象保存恢复机制。 远程调用时方便对对象进行编码和解码,实现对象直接传输。 将对象持久化到介质中,实现对象直接存储。 允许对象自定义外部存储的格式。 Java 将对象序列化为二进制文件,在大部分情况下,开发人员只需要使被序列化的类实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写。 需要注意的点: 序列化ID(在版本升级时反序列化仍保持对象的唯一性) private static

qq_44671005的博客 255

SAP Integration Suite 与 SAP Cloud Integration 的关系解析

SAP Cloud Integration是SAP Integration Suite套件的核心组件,专注于消息与流程集成。两者关系可概括为:Integration Suite是SAP BTP上的集成平台套件(iPaaS),而Cloud Integration是其中负责应用与B2B集成的关键能力。日常所说的"CPI"实际指代的是Integration Suite中的Cloud Integration功能。该套件还包含API管理、事件网格等其他集成能力,共同构成企业集成解决方案。理解这一层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 601

深入了解序列化writeObject、readObject、readResolve

最后再总结一下java的序列化- 必须实现Serializable接口或Externalizable接口的类才能进行序列化- transient和static修饰符修饰的成员变量不会参与序列化和反序列化- 反序列化对象和序列化前的对象的全类名和serialVersionUID必须一致- 在目标类中添加私有的writeObject和readObject方法可以覆盖默认的序列化和反序列化方法。

qq_43985303的博客 2243

uniapp:实现扫描二维码+自定义扫描框+扫一扫功能,支持扫码识别二维码、条形码(条码)、微信/支付宝等二维码功能,自定义扫码页面可添加按钮或文字展示布局(移动端H5网页/小程序/安卓苹果APP端)

UNI-APP实现扫描二维码,uniapp扫描条形码,uniapp实现扫一扫功能,扫码成功后跳转页面,uniApp扫描条码,uniApp-H5 使用摄像头扫码功能(扫一扫),实现手机扫描二维码并跳转全过程示例代码,用户扫码后自动跳转到链接,uniapp怎么调用扫一扫功能,uniapp实现扫一扫功能,uniapp请求相机使用权限,扫一扫权限申请,uniapp调用摄像头扫码,uniapp实现调用相机扫码,UniApp 实现扫描二维码,uniapp APP安卓苹果ios实现扫码扫一扫,Uniapp微信小程序扫描二

✅ 精选推荐文章 4708

Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度

【代码】Vue 前端导出页面A4大小pdf,Vue前端导出pdf自动切割换页不切割内容 Vue导出页面pdf自动分页和添加页码 导出的pdf提高清晰度。

weixin_41346436的博客 1800

java 对象序列化

如果需要更复杂的序列化控制,可以定义和// 调用默认序列化方法// 进行额外处理(例如加密某些字段)// 调用默认反序列化方法// 进行额外处理(例如解密某些字段)当然我们也可以自定义序列化过程。

sjb2274540432的博客 1850

在 PFCG 中完成 SAP Fiori 对象分配:把 Business Catalog、Space、Page 与授权一次讲透

摘要:SAP Fiori权限配置的关键在于理解Business Catalog与Space的分层授权逻辑。传统SAP GUI中直接分配事务码的方式不适用于Fiori环境,必须通过PFCG为角色分配Catalog(提供应用访问权限)和Space(控制首页展示结构)。Catalog会自动解析所需OData服务授权,而Space则决定用户在Launchpad中看到的导航布局。常见错误包括直接分配Page而非其所属Space,或仅配置Space而忽略Catalog。最佳实践是优先使用Catalog驱动授权提议,再在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 327

序列化对象

对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列 化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制 流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序 一旦获得了这种二进制流(无论是从磁盘中获取的,还是通过网络获取的),都可以 将这种二进制流恢复成原来的Java对象。 序列化的含义和意义 序列化机制允许将实现序列化的J...

weixin_42047392的博客 367

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C#对象反序列化与对象序列化

C#对象反序列化与对象序列化 对象序列化的介绍 1、.net支持对象序列化的几种方式 二进制序列化  SOAP序列化  XML序列化 2、几种序列化的区别 二进制格式和SOAP格式可序列化一个类型的所有可序列化字段,不管       使用二进制方式的序列化与反序列化的代码 using System; using System.Collections.Generic; usi

GaraMaps的博客 1989

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java 对象怎么序列化,java对象序列化总结

java对象序列化小结百度百科上介绍序列化是这样的:序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 Serializa...

weixin_39896839的博客 464

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java对象流、对象序列化与反序列化

Java对象流、对象序列化与反序列化 对象的序列化可以将一个对象的成员信息保存为一个datdatdat文件存到硬盘上,反序列化就是可以直接从该文件读该对象。 package Exp7; import java.io.*; class PersonalInfo implements Serializable { //实体类实现接口Serializable private static final long serialVersionUID = 1L; private String na

Harris-H的博客 570

Java对象序列化

1.说明所有分布式应用常常需要跨平台,跨网络,因此要求所有传的参数、返回值都必须实现序列化。而对象序列化包含序列化和反序列化二部分,序列化是把Java对象转换为字节序列的过程,反序列化是把字节序列恢复为Java对象的过程。2.用途对象序列化主要有二种用途,一个是把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中,也叫持久化对象;另一个是在网络上传送对象的字节序列,也叫网络传输对象。3.实现序...

水木年华的博客 1851

对象的序列化

对象的序列化 对象序列化: 对象序列化的定义:指把并行数据转换成串行数据的处理过程,而对象序列化(Object Serialization)是指把对象的状态数据以字节流的形式进行处理,一般用于实现完全的对象。简单地说,对象的序列化可以理解为使用I/O“对象流”类型实现的对象读

wangyanping1234的专栏 3026

对象的序列化和反序列化

对象序列化: 目标:将对象保存到磁盘中,或允许在网络中直接传输对象。 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流,都可以将这种二进制流恢复成原来的java对象。 含义:序列化机制将实现序列化的Java对象转换成字节序列,这些字节序列可以保存在磁盘上,或通过网络...

weixin_42373873的博客 643
上一篇: 异常处理
下一篇: 百度云推送避免点击通知后直接进入主Activity
我叫王哈哈
博客等级 码龄11年 36粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值