用序列化+单例模式实现数据持久化

合集下载

前端开发技术中的数据持久化解决方案

前端开发技术中的数据持久化解决方案

前端开发技术中的数据持久化解决方案在当今互联网时代,前端开发技术的发展和创新日新月异。

作为前端开发人员,我们不仅需要关注页面的外观和交互体验,还需要考虑如何高效地处理和存储大量的数据。

本文将围绕前端数据持久化的解决方案展开讨论,探讨在实际开发中的应用。

一、Cookie和LocalStorageCookie和LocalStorage是最常见的前端数据持久化方案之一。

Cookie是由服务器发送给浏览器的一小段数据,浏览器会将其保存在本地,并在每次请求同一域名下的网页时将其发送给服务器。

与Cookie相比,LocalStorage更便于操作,可以在浏览器上长时间存储数据。

这两种方案都是基于浏览器的,因此在跨平台应用中使用时,需要注意不同浏览器的兼容性。

二、IndexedDBIndexedDB是一种高级的浏览器本地存储方案,使用JavaScript进行操作。

与Cookie和LocalStorage相比,IndexedDB具备更高的性能和更大的存储容量。

IndexedDB采用键值对的方式存储数据,通过索引进行数据的增删改查。

不过,由于IndexedDB的操作接口较为复杂,学习和使用的门槛较高,因此在实际开发中使用时需要权衡利弊。

三、WebSQLWebSQL是HTML5提供的一种关系型数据库解决方案,通过SQL语句对数据进行操作。

WebSQL的优势在于其能够模拟传统关系型数据库的操作,比如表的创建、索引的建立等。

然而,由于WebSQL的标准目前已经停止更新和维护,同时也没有得到一些浏览器的支持,因此在实际应用中需要谨慎选择。

四、Service WorkerService Worker是一种在浏览器后台运行的脚本,可以拦截和处理网络请求。

通过Service Worker,我们可以将请求的数据缓存到本地,提供离线访问的能力。

与其他数据持久化方案相比,Service Worker更加强大灵活,可以自定义缓存策略,并实现增量更新等功能。

如何在Java中进行数据的持久化和读取操作

如何在Java中进行数据的持久化和读取操作

如何在Java中进行数据的持久化和读取操作数据的持久化是指将程序中的数据存储在持久存储介质中(如文件、数据库等)以便下次程序运行时能够重新读取和使用。

在Java中,数据的持久化和读取操作可以通过文件操作、数据库操作、序列化和反序列化等方式实现。

本文将重点介绍在Java中进行数据的持久化和读取操作的几种方法。

一、文件操作1.1文件写入在Java中进行文件数据的持久化操作可以使用FileOutputStream 或者BufferedWriter等类来实现。

通过FileOutputStream类,可以将数据以字节的形式写入文件,示例代码如下:```javatry {String data = "Hello, World!";FileOutputStream fos = new FileOutputStream("data.txt");fos.write(data.getBytes());fos.close();} catch (IOException e) {e.printStackTrace();}```上述代码中,首先定义了一个字符串数据并赋值给data变量,然后通过FileOutputStream类打开文件输出流,并将字符串数据以字节形式写入文件中,最后关闭文件输出流。

1.2文件读取使用FileInputStream或者BufferedReader类可以实现对文件数据的读取操作。

示例代码如下:```javatry {FileInputStream fis = new FileInputStream("data.txt");int content;while ((content = fis.read()) != -1) {System.out.print((char) content);}fis.close();} catch (IOException e) {e.printStackTrace();}```上述代码中,首先使用FileInputStream类打开文件输入流,并定义一个整型变量content用于存储读取的字节数据。

前端开发中的持久化与离线数据存储技巧

前端开发中的持久化与离线数据存储技巧

前端开发中的持久化与离线数据存储技巧随着互联网的发展,前端开发变得越来越重要。

前端开发主要包括网页和移动应用的设计和开发。

在开发过程中,开发者需要解决数据的存储和持久化的问题,以提供更好的用户体验和数据的可靠性。

本文将探讨前端开发中的持久化和离线数据存储技巧。

一、持久化数据存储在前端开发中,持久化数据存储是指将数据保存到客户端本地,以便在关闭网页或移动应用后再次访问时仍然可以获取到数据。

常用的持久化数据存储方式有以下几种:1. CookieCookie 是存储在客户端浏览器中的小型文本文件,可以用于存储有限的数据,通常大小限制在几 KB 以内。

Cookie 适合存储少量的用户数据,例如用户的登录状态、购物车信息等。

但由于 Cookie 存储在浏览器中,因此可能会受到恶意用户的篡改和破坏,开发者需要注意对数据的安全性进行处理。

2. Web StorageWeb Storage 包括了 localStorage 和 sessionStorage 两种机制。

localStorage 是一种长期存储的数据存储方式,存储的数据在用户关闭浏览器后仍然可用;而sessionStorage 则是一种会话级别的存储方式,数据在用户关闭浏览器后会自动删除。

Web Storage 的容量比 Cookie 大得多,可以存储几 MB 的数据。

开发者可以使用 Web Storage 存储用户的个性化设置、表单数据等信息,提供更好的用户体验。

同时,Web Storage 只能存储字符串类型的数据,开发者需要将其他类型的数据转换为字符串再进行存储。

3. IndexedDBIndexedDB 是一种支持高性能、大规模数据存储的浏览器数据库。

与传统的关系型数据库不同,IndexedDB 是一种基于对象存储的数据库,存储的是 JavaScript 对象。

IndexedDB 的容量比 Web Storage 更大,可以存储 GB 级别的数据。

什么是持久化、序列化、实例化、初始化

什么是持久化、序列化、实例化、初始化

什么是持久化、序列化、实例化、初始化实例化:当⼀个对象被声明创建就是实例化初始化:给⼀个属性或者⼀个对象赋值是初始化什么是持久化?持久化是将程序数据在持久状态和瞬时状态间转换的机制。

持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。

持久化的主要应⽤是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘⽂件中、XML数据⽂件中等等。

JDBC就是⼀种持久化机制。

⽂件IO也是⼀种持久化机制。

如何去理解?在⼀定周期内保持不变就是持久化,持久化是针对时间来说的。

数据库中的数据就是持久化了的数据,只要你不去删除或修改。

⽐如在IE浏览器中⼀次Session会话中Session对象变量也是不变的,是Session容器中持久化。

对象持久化的⽅式有很多种,根据周期不同有,page,Session,Application。

对象序列化机制对于需要将对象的状态保存到⽂件中,⽽后能够通过读⼊对象状态来重新构造对象,恢复程序状态,对象序列化的过程是对象持久化的⽅法之⼀,把对象保存到⽂件中。

不同层⾯理解:简单的理解持久化可以在⼆个层⾯:应⽤层和系统层应⽤层如果关闭(shutdown)你的应⽤然后重新启动则先前的数据依然存在。

系统层如果关闭(shutdown)你的系统(电脑)然后重新启动则先前的数据依然存在。

序列化是什么?序列化和持久化很相似,有些⼈甚⾄混为⼀谈,其实还是有区别的,序列化是为了解决对象的传输问题,传输可以在线程之间、进程之间、内存外存之间、主机之间进⾏。

之所以在这⾥提到序列化,是因为我们可以利⽤序列化来辅助持久化,可以说凡是可以持久化的对象都可以序列化,因为序列化相对容易⼀些(也不是很容易),所以主流的软件基础设施,⽐如.net和java,已经把序列化的框架完成了。

持久化⽅案可以分为关系数据库⽅案、⽂件⽅案、对象数据库⽅案、xml数据库⽅案,现今主流的持久化⽅案是关系数据库⽅案,关系数据库⽅案不仅解决了并发的问题,更重要的是,关系数据库还提供了持久化服务之外的价值:统计分析功能。

掌握前端开发中的数据持久化和同步方法

掌握前端开发中的数据持久化和同步方法

掌握前端开发中的数据持久化和同步方法在前端开发中,数据的持久化和同步方法是非常重要的。

它们决定了一个应用程序的数据在用户设备和服务器之间的传输和存储方式,直接影响用户体验的流畅度和数据的安全性。

因此,掌握前端开发中的数据持久化和同步方法是每个前端开发者都需要具备的技能之一。

一、数据持久化的重要性数据持久化指的是将数据保存在不易丢失或损坏的地方,以便在应用程序关闭或设备重启后能够重新加载和使用。

传统上,在前端开发中,我们使用Cookie来实现数据的持久化。

但是,随着技术的不断发展,出现了更加先进和灵活的数据持久化方案,例如Web Storage和IndexedDB。

Web Storage是HTML5提供的一种在浏览器端保存数据的机制,它包括两种存储方式:localStorage和sessionStorage。

localStorage允许我们将数据永久保存在用户的设备上,而sessionStorage只在当前会话期间有效。

通过使用Web Storage,我们可以方便地实现数据的持久化,并且不会给服务器带来额外的负担。

IndexedDB是一种浏览器内部的数据库系统,它可以在用户设备上保存大量数据,并提供了高效的数据查询和索引功能。

与Web Storage相比,IndexedDB的容量更大,并且支持事务操作和复杂的数据结构。

二、数据同步的方法在前端开发中,数据往往需要与服务器进行同步,以便实现数据的共享和更新。

常见的数据同步方法有轮询和长连接。

轮询是指前端定时向服务器发送请求,查询数据是否有更新。

这种方法简单易行,但是会造成无谓的请求和服务器资源的浪费。

为了解决这个问题,出现了基于WebSocket的长连接。

WebSocket是一种全双工通信协议,它可以在浏览器和服务器之间建立较长时间的连接,并实时传输数据。

相比于轮询,WebSocket具有更低的延迟和更高的效率,可以实现更实时和即时的数据传输和更新。

序列化的作用范文

序列化的作用范文

序列化的作用范文序列化(Serialization)是将对象转换为可以存储或传输的格式的过程,常见的格式包括二进制流、XML、JSON等。

序列化的作用主要有以下几个方面:1.持久化存储:在开发过程中,往往需要将一些数据持久化到硬盘上,以便在程序重新启动后能够恢复上一次的状态。

通过序列化,可以将对象转换为二进制流,然后将其存储到文件中。

当需要恢复数据时,可以读取文件,将二进制流反序列化为原始的对象。

这样,就实现了对象的持久化存储。

2.网络传输:在分布式系统中,不同的计算机之间需要进行对象的传输。

然而,在网络中只能传输二进制数据或者文本数据,不能直接传输对象。

通过序列化,可以将对象转换为二进制流或者文本数据,然后通过网络传输到其他计算机。

在接收端,可以将接收到的数据反序列化为原始的对象。

这样,就实现了对象在网络中的传输。

3.内存共享:在多线程或多进程并发编程中,不同的线程或进程之间需要共享数据。

然而,不同的线程或进程使用不同的栈空间,无法直接共享对象。

通过序列化,可以将对象转换为二进制流,并通过共享内存将数据传递给其他线程或进程。

在接收端,可以将接收到的二进制流反序列化为原始的对象。

这样,就实现了对象在内存中的共享。

4.远程对象调用:在分布式系统中,不同的计算机之间需要调用对方的对象。

然而,对象的定义和实现往往位于不同的计算机上,无法直接调用。

通过序列化,可以将对象转换为二进制流或者文本数据,然后通过网络传输到另一个计算机上。

在另一个计算机上,可以将接收到的数据反序列化为原始的对象,并调用对应的方法。

通过这种方式,就实现了远程对象调用。

5.跨平台兼容:在不同的编程语言或不同的操作系统中,对象的表示方式可能不同。

通过序列化,可以将对象转换为通用的格式,如二进制流、XML或者JSON,这些格式可以跨平台和跨语言地进行传输和存储。

在接收端,可以将接收到的数据反序列化为原始的对象,以实现跨平台的兼容性。

总结来说,序列化的作用在于实现对象的持久化存储、网络传输、内存共享、远程对象调用和跨平台兼容。

persistence createstatement方法

persistence createstatement方法

persistence createstatement方法在编程领域,persistence 指的是数据持久化,即将数据保存在磁盘或其他存储介质上。

createStatement 方法则是一种实现数据持久化的常见手段。

本文将详细介绍persistence 和createStatement 方法,并通过实例演示其应用场景,帮助读者更好地理解和掌握这一技术。

1.persistence 概念解析Persistence 这个词源于拉丁语,意为“持续存在”。

在计算机科学中,persistence 主要指数据在程序运行期间的持久化存储。

数据持久化是许多应用程序的核心需求,例如,当一个程序需要临时保存用户设置、记录操作日志或存储统计数据时,就需要使用数据持久化技术。

2.createStatement 方法介绍CreateStatement 方法是一种用于创建SQL 语句的对象方法。

在Java 中,它属于java.sql 包,主要用于数据库操作。

CreateStatement 方法可以用来执行INSERT、UPDATE、DELETE 等SQL 语句,实现数据的增删改查。

以下是CreateStatement 方法的基本语法:```javaConnection connection = null;try {connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();// 执行SQL 语句statement.executeUpdate("INSERT INTO table_name (column1, column2) VALUES (value1, value2)");} catch (SQLException e) {e.printStackTrace();} finally {if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}```3.应用场景及实例演示在日常生活中,我们经常会遇到需要保存数据的情况。

前端框架中的数据持久化与存储方法

前端框架中的数据持久化与存储方法

前端框架中的数据持久化与存储方法数据持久化和存储是前端开发中非常重要的概念,它们涉及到如何在前端框架中存储和管理数据。

在本文中,我们将探讨前端框架中的数据持久化和存储方法。

我们将详细介绍前端框架中常用的三种数据持久化和存储方法:本地存储、缓存和数据库。

1. 本地存储本地存储是指将数据存储在浏览器的本地存储介质中,以便在用户下次访问网站时恢复数据。

在前端开发中,常用的本地存储方法有两种:cookie和Web Storage。

首先,cookie是一小段存储在用户计算机上的数据。

它可以在用户发送请求时自动添加到请求头中,并随着响应一起返回给服务器。

虽然cookie的大小有限制,但它是一种简单且广泛支持的本地存储方法。

其次,Web Storage包括两个对象:sessionStorage和localStorage。

它们在用户的浏览器中提供了一种更大的存储空间。

sessionStorage的数据在会话结束后被销毁,而localStorage的数据会持久保存在用户的浏览器中,除非用户主动删除。

2. 缓存缓存是将数据暂时保存在内存中,以便在以后的请求中快速访问。

在前端框架中,常用的缓存方法有两种:浏览器缓存和应用程序缓存。

首先,浏览器缓存通过在首次请求后将响应数据存储在本地,以避免再次从服务器获取相同的数据。

这可以提高页面加载速度和减轻服务器负载。

开发人员可以通过设置响应头中的Cache-Control和Expires字段来控制浏览器缓存。

其次,应用程序缓存是通过将资源文件(如HTML、CSS、JavaScript文件等)保存在浏览器的缓存中,以便在离线状态下访问网站。

这种缓存方法适用于需要离线访问的应用程序,可以提供更好的用户体验。

3. 数据库数据库是一种用于存储和管理结构化数据的方法。

在前端框架中,常用的数据库有两种:本地数据库和远程数据库。

首先,本地数据库通常是基于浏览器的数据库,如IndexedDB和Web SQL Database。

Docker容器持久化存储方法与实现原理

Docker容器持久化存储方法与实现原理

Docker容器持久化存储方法与实现原理简介:随着容器化技术的迅速发展,Docker已经成为最受欢迎的容器化平台之一。

然而,Docker容器的瞬时性特性也带来了一个重要问题,即容器内的数据在容器销毁后会丢失。

为了解决这个问题,Docker提供了多种持久化存储方法和实现原理,本文将深入探讨这些方法和原理。

一、数据卷(Volume):数据卷是Docker中最基本的持久化存储方法之一。

数据卷可以将容器内的数据进行持久化存储,并且在容器被销毁后仍然保留。

Docker将数据卷挂载为容器内部的一个目录,该目录既可以是主机上的一个目录,也可以是其他容器中的一个目录。

数据卷的实现原理是通过在主机上创建一个虚拟的文件系统,然后将这个虚拟文件系统挂载到容器内部。

这样,容器内的数据就可以保存在挂载的文件系统中,从而实现持久化存储。

二、绑定挂载(Bind Mount):绑定挂载是另一种常见的持久化存储方法。

绑定挂载允许将主机上的一个目录或文件直接挂载到容器内部,从而实现容器内数据的持久化。

与数据卷不同,绑定挂载不需要创建虚拟文件系统,而是直接将主机上的文件或目录与容器内的文件或目录进行关联。

绑定挂载的实现原理是通过在容器创建时将主机上的目录或文件直接映射到容器内,容器内的操作将直接影响到主机上的对应文件或目录。

这种方式可以实现容器内数据的持久化存储,并且对于容器外的系统来说,容器内的数据就像是直接存在于主机上一样。

三、存储卷(Storage Volumes):存储卷是Docker提供的一种高级持久化存储方法。

存储卷是对数据卷和绑定挂载的抽象,它可以将容器内的数据进行持久化,并且支持多种后端存储驱动。

存储卷的实现原理是通过将容器内的数据存储到一个独立的卷中。

这个独立的卷可以是主机上的一个目录,也可以是远程存储服务器上的一个目录。

通过使用存储卷,可以实现数据的持久化存储,并且可以方便地迁移数据到不同的环境。

四、网络存储(Network Storage):网络存储是一种将容器内数据存储到网络存储系统中的持久化存储方法。

oraclejava面试题及答案

oraclejava面试题及答案

oraclejava面试题及答案Oracle Java 面试题及答案1. 什么是Java虚拟机(JVM)?答:Java虚拟机(JVM)是一个可以执行Java字节码的虚拟计算机。

它是一个抽象的计算机,通过在实际的计算机上通过软件或硬件来实现。

JVM提供了内存管理、垃圾回收和安全性等功能,使得Java能够实现“一次编写,到处运行”的特性。

2. Java有哪些基本的数据类型?答:Java有8种基本数据类型,分别是:- 4种整型:byte(8位有符号整数)、short(16位有符号整数)、int(32位有符号整数)、long(64位有符号整数)。

long类型后面通常跟一个'L'或'l'。

- 2种浮点型:float(32位单精度浮点数)、double(64位双精度浮点数)。

double类型后面通常跟一个'D'或'd'。

- 1种字符型:char(16位Unicode字符)。

- 1种布尔型:boolean。

3. 什么是Java集合框架?答:Java集合框架是Java中一组接口和类,用于存储和操作一组对象。

它提供了一种统一的方式来处理对象集合,包括List、Set、Map等接口,以及它们的实现类ArrayList、HashSet、HashMap等。

4. 什么是多线程?Java中如何实现多线程?答:多线程是指一个程序中可以同时执行多个线程(任务)。

Java中实现多线程有两种主要方式:- 继承Thread类并重写其run方法。

- 实现Runnable接口并实现其run方法,然后将Runnable实例传递给Thread对象。

5. 什么是同步和异步?答:同步是指程序的执行顺序是按照代码的顺序依次执行,每个操作必须等待前一个操作完成后才能开始。

异步则是指程序可以并行执行,一个操作不需要等待前一个操作完成就可以开始执行。

在Java中,可以通过多线程、Future、Callable等机制来实现异步操作。

objectdeserializer 用于list数组

objectdeserializer 用于list数组

objectdeserializer 用于list数组对象反序列化是将二进制或其他格式的数据转换为程序中的对象的过程。

在软件开发中,对象反序列化常用于数据的持久化、数据传输等场景。

本文将讨论对象反序列化的基本概念,以及如何在这一过程中有效地处理List数组。

对象反序列化基本概念1. 什么是对象反序列化?对象反序列化是将序列化的对象数据重新还原为原始的对象的过程。

在序列化过程中,对象被转换为字节流以便于存储或传输。

反序列化则是将这些字节流还原为相应的对象,使得程序能够继续使用这些对象。

2. 序列化与反序列化的作用•数据持久化:序列化对象可以将对象保存到文件或数据库中,以实现数据的长期存储。

•分布式系统:在网络中传输对象时,序列化可将对象转换为字节流,传输后再反序列化还原为对象。

3. 常见的序列化格式•Java中的序列化:Java提供了Serializable接口,可以使用ObjectOutputStream进行对象的序列化,ObjectInputStream进行反序列化。

•JSON序列化:JSON是一种轻量级的数据交换格式,广泛应用于Web开发。

常用的JSON序列化库有Jackson、Gson等。

处理List数组的对象反序列化1. 对象中包含List数组如果对象中包含List数组,需要注意List的实现类必须是Serializable 的。

例如:import java.io.Serializable;import java.util.List;public class MyObject implements Serializable{private List<String>myList;// 省略其他属性和方法}2. 使用Java对象流反序列化List数组import java.io.FileInputStream;import java.io.ObjectInputStream;import java.util.List;public class DeserializationExample {public static void main(String[]args){try(ObjectInputStream ois =new ObjectInputStream(new FileInputStream("serializedObject.dat"))){MyObject myObject =(MyObject)ois.readObject();List<String>myList =myObject.getMyList();// 对List进行进一步处理for(String item :myList){System.out.println(item);}}catch(Exception e){e.printStackTrace();}}}3. 使用JSON库反序列化List数组import com.fasterxml.jackson.databind.ObjectMapper;import java.io.File;import java.util.List;public class JSONDeserializationExample {public static void main(String[]args){try{ObjectMapper objectMapper =new ObjectMapper();MyObject myObject =objectMapper.readValue(new Fil e("serializedObject.json"),MyObject.class);List<String>myList =myObject.getMyList();// 对List进行进一步处理for(String item :myList){System.out.println(item);}}catch(Exception e){e.printStackTrace();}}}注意事项与建议1.List的元素类型需实现Serializable接口:List中的元素类型必须是可序列化的,以确保整个对象图的完整性。

前端开发中的数据缓存和持久化存储技术

前端开发中的数据缓存和持久化存储技术

前端开发中的数据缓存和持久化存储技术在现代的互联网应用中,数据缓存和持久化存储成为了前端开发中的重要课题。

为了提高用户体验和数据的安全性,前端开发人员需要掌握一系列的技术来处理数据的缓存和持久化存储。

本文将介绍一些常见的数据缓存和持久化存储技术,帮助读者了解这方面的知识。

一、数据缓存技术1. 本地缓存本地缓存是前端开发中最常用的一种数据缓存技术。

通过将数据存储在客户端的本地存储中,可以大大提高数据的访问速度和用户体验。

目前常用的本地缓存技术有Web Storage和IndexedDB。

Web Storage是HTML5提供的一种本地存储方案,包括了localStorage和sessionStorage两种类型。

localStorage具有较大的存储容量,可以长期保存数据;而sessionStorage则是会话级别的存储,当页面关闭后会自动清除。

开发人员可以根据实际情况选择不同的存储类型。

IndexedDB是一种基于对象的数据库,提供了更强大的功能和更复杂的数据结构。

它可以存储大量的结构化数据,并支持索引和事务操作。

不过,由于其较复杂的API和使用难度,对于简单的缓存需求,Web Storage可能更适合。

2. CDN缓存CDN(Content Delivery Network)缓存是一种通过将数据存储在分布式服务器上的缓存技术。

当用户请求数据时,CDN会根据用户的地理位置自动选择最近的服务器进行数据传输,从而提高数据的响应速度和下载速度。

对于大规模的媒体文件或静态资源,通过CDN缓存可以有效减轻服务器的负载压力。

3. HTTP缓存HTTP缓存是浏览器和服务器之间的缓存机制。

当客户端请求某个资源时,服务器可以在响应头中设置缓存策略,指示浏览器将该资源缓存起来。

下次请求时,浏览器会直接从缓存中取得该资源,而不需要再次请求服务器。

这样可以减少网络传输的时间和带宽消耗,提高用户的访问速度。

二、持久化存储技术1. CookieCookie是一种广泛使用的持久化存储技术。

ruoyi 序列化过程

ruoyi 序列化过程

ruoyi 序列化过程Ruoyi是一种基于Spring Boot和Vue.js的快速开发平台,它提供了诸多便捷的功能和组件,帮助开发人员快速搭建、集成和部署Web 应用程序。

其中一个重要的特性就是其支持对象的序列化。

序列化是指将对象转换为字节流的过程,使得该对象可以被保存到磁盘、通过网络传输或在内存中进行跨应用或进程的传递。

Ruoyi支持对象的序列化,允许开发人员在进行网络传输、数据持久化或分布式部署时,可以方便地将对象进行序列化和反序列化操作。

Ruoyi使用Java中的序列化机制实现对象的序列化。

Java提供了两种序列化机制:Serializable和Externalizable。

Ruoyi通常使用Serializable来实现序列化,因为它是默认的机制,并且比Externalizable简单易用。

在Ruoyi中,要使一个类可序列化,只需要实现java.io.Serializable接口即可。

Serializable接口是一个标记接口,不包含任何方法,它只是起到标识作用,告诉Java虚拟机该类可进行序列化操作。

Ruoyi的序列化过程是自动完成的,无需开发人员手动编写序列化代码。

当需要将一个对象序列化时,只需要将该对象写入到输出流中即可。

Ruoyi使用Java的ObjectOutputStream类来实现对象的序列化。

ObjectOutputStream类具有writeObject()方法,可以将指定的对象写入输出流中。

例如,假设我们有一个User类,其中包含了用户的姓名和年龄两个属性。

如果要将一个User对象序列化并保存到磁盘中,可以使用如下代码:```javaUser user = new User("张三", 20);try {FileOutputStream fileOut = newFileOutputStream("user.ser");ObjectOutputStream out = new ObjectOutputStream(fileOut);out.writeObject(user);out.close();fileOut.close();} catch (IOException i) {i.printStackTrace();}```上述代码中,我们通过FileOutputStream创建了一个文件输出流对象,并将其传递给ObjectOutputStream,然后使用writeObject()方法将User对象写入到输出流中。

Android开发中的单例模式应用详解

Android开发中的单例模式应用详解

Android开发中的单例模式应⽤详解本⽂实例讲述了Android开发中的单例模式应⽤。

分享给⼤家供⼤家参考,具体如下:单例模式是应⽤最⼴的设计模式之⼀,在应⽤这种模式的时候,单例对象的类必须保证只有⼀个实例存在。

许多时候,整个系统只需要拥有⼀个全局对象,这样有利于协调系统的整体⾏为。

如⼀个应⽤中,应该只有ImageLoader实例,这个ImageLoader实例中⼜包含⽹络请求、缓存系统、线程池等,很耗资源,因此没有理由让他构造多个实例。

这种不能⾃由构造对象的情况就是使⽤单例模式的场景。

在Android系统中存在很多这种场景,⽐如最常⽤的context.getSystemService(),BluetoothAdapter.getDefaultAdapter()等等都是使⽤的单例模式。

下⾯就列出⼏种单例模式的构建⽅式以及各种⽅式的优缺点。

1.懒汉模式懒汉模式是申明⼀个静态变量,并且在⽤户第⼀次调⽤getInstance时进⾏初始化,懒汉模式实现如下:public class Singleton {private static Singleton sInstance;private Singleton(){}public static synchronized Singleton getInstance(){if(sInstance == null){sInstance = new Singleton();}return sIntance;}}getIntance()⽅法中添加了synchronized关键字,也就是getInstance是⼀个同步⽅法,这就是上⾯所说的在多线程情况下保证单例对象唯⼀性的⼿段。

但是这样存在⼀个问题,即使sInstance已经被初始化,每次调⽤getInstance都会进⾏同步,这样会消耗不必要的资源,这也是懒汉单例模式存在的最⼤问题。

懒汉模式的最⼤优点是单例只有在使⽤的时候才会被实例化,在⼀定程度上节约了资源;缺点是第⼀次加载时需要及时初始化,反应稍慢,最⼤的问题是每次调⽤getInstance都进⾏同步,造成不必要的同步开销。

ActiveMQ持久化消息的三种方式【详细配置讲解】

ActiveMQ持久化消息的三种方式【详细配置讲解】

ActiveMQ持久化消息的三种⽅式【详细配置讲解】利⽤消息队列的异步策略,可以从很⼤程序上缓解程序的压⼒,但是,如果MQ所在的机器down机了,⼜如果队列中的数据不是持久的就会发⽣数据丢失,后果是可想⽽知的,所以消息的持久化是不可不讨论的话题。

1) 关于ActiveMQ消息队列的持久化,主要是在ActiveMQ的配置⽂件中设置(看粗体部分).Java代码1. <!--2. Licensed to the Apache Software Foundation (ASF) under one or more3. contributor license agreements. See the NOTICE file distributed with4. this work for additional information regarding copyright ownership.5. The ASF licenses this file to You under the Apache License, Version 2.06. (the "License"); you may not use this file except in compliance with7. the License. You may obtain a copy of the License at8.9. /licenses/LICENSE-2.010.11. Unless required by applicable law or agreed to in writing, software12. distributed under the License is distributed on an "AS IS" BASIS,13. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.14. See the License for the specific language governing permissions and15. limitations under the License.16. -->17. <!-- START SNIPPET: example -->18. <beans19. xmlns="/schema/beans"20. xmlns:amq="/schema/core"21. xmlns:xsi="/2001/XMLSchema-instance"22. xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.0.xsd23. /schema/core /schema/core/activemq-core.xsd24. /camel/schema/spring /camel/schema/spring/camel-spring.xsd">25.26. <!-- Allows us to use system properties as variables in this configuration file -->27. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">28. <property name="locations">29. <value>file:///${activemq.base}/conf/credentials.properties</value>30. </property>31. </bean>32.33. <broker xmlns="/schema/core" brokerName="localhost" dataDirectory="${activemq.base}/data">34.35. <!-- Destination specific policies using destination names or wildcards -->36. <destinationPolicy>37. <policyMap>38. <policyEntries>39. <policyEntry queue=">" memoryLimit="5mb"/>40. <policyEntry topic=">" memoryLimit="5mb">41. <!-- you can add other policies too such as these42. <dispatchPolicy>43. <strictOrderDispatchPolicy/>44. </dispatchPolicy>45. <subscriptionRecoveryPolicy>46. <lastImageSubscriptionRecoveryPolicy/>47. </subscriptionRecoveryPolicy>48. -->49. </policyEntry>50. </policyEntries>51. </policyMap>52. </destinationPolicy>53.54. <!-- Use the following to configure how ActiveMQ is exposed in JMX -->55. <managementContext>56. <managementContext createConnector="false"/>57. </managementContext>58.58.59. <!-- The store and forward broker networks ActiveMQ will listen to -->60. <networkConnectors>61. <!-- by default just auto discover the other brokers -->62. <networkConnector name="default-nc" uri="multicast://default"/>63. <!-- Example of a static configuration:64. <networkConnector name="host1 and host2" uri="static://(tcp://host1:61616,tcp://host2:61616)"/>65. -->66. </networkConnectors>67.68. <persistenceAdapter>69. <amqPersistenceAdapter syncOnWrite="false" directory="${activemq.base}/data" maxFileLength="20 mb"/>70. </persistenceAdapter>71.72. <!-- Use the following if you wish to configure the journal with JDBC -->73. <!--74. <persistenceAdapter>75. <journaledJDBC dataDirectory="${activemq.base}/data" dataSource="#postgres-ds"/>76. </persistenceAdapter>77. -->78.79. <!-- Or if you want to use pure JDBC without a journal -->80.81. <span style="color: #ff6600;"> <span style="color: #000000;"><persistenceAdapter>82. <jdbcPersistenceAdapter dataSource="#mysql-ds"/>83. </persistenceAdapter></span></span>84.85.86. <sslContext>87. <sslContext keyStore="file:${activemq.base}/conf/broker.ks" keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts" trustStorePassword="password"/>88. </sslContext>89.90. <!-- The maximum about of space the broker will use before slowing down producers -->91. <systemUsage>92. <systemUsage>93. <memoryUsage>94. <memoryUsage limit="20 mb"/>95. </memoryUsage>96. <storeUsage>97. <storeUsage limit="1 gb" name="foo"/>98. </storeUsage>99. <tempUsage>100. <tempUsage limit="100 mb"/>101. </tempUsage>102. </systemUsage>103. </systemUsage>104.105.106. <!-- The transport connectors ActiveMQ will listen to -->107. <transportConnectors>108. <transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>109. <transportConnector name="ssl" uri="ssl://localhost:61617"/>110. <transportConnector name="stomp" uri="stomp://localhost:61613"/>111. <transportConnector name="xmpp" uri="xmpp://localhost:61222"/>112. </transportConnectors>113.114. </broker>115.116. <!--117. ** Lets deploy some Enterprise Integration Patterns inside the ActiveMQ Message Broker118. ** For more details see119. **120. ** /enterprise-integration-patterns.html121. -->122. <camelContext id="camel" xmlns="/camel/schema/spring">123.124. <!-- You can use a <package> element for each root package to search for Java routes -->125. <package>org.foo.bar</package>126.127. <!-- You can use Spring XML syntax to define the routes here using the <route> element -->128. <route>129. <from uri="activemq:example.A"/>130. <to uri="activemq:example.B"/>130. <to uri="activemq:example.B"/>131. </route>132. </camelContext>133.134. <!--135. ** Lets configure some Camel endpoints136. **137. ** /camel/components.html138. -->139.140. <!-- configure the camel activemq component to use the current broker -->141. <bean id="activemq"class="ponent.ActiveMQComponent" >142. <property name="connectionFactory">143. <bean class="org.apache.activemq.ActiveMQConnectionFactory">144. <property name="brokerURL" value="vm://localhost?create=false&amp;waitForStart=10000" />145. <property name="userName" value="${ername}"/>146. <property name="password" value="${activemq.password}"/>147. </bean>148. </property>149. </bean>150.151.152.153. <!-- Uncomment to create a command agent to respond to message based admin commands on the ActiveMQ.Agent topic -->154. <!--155. <commandAgent xmlns="/schema/core" brokerUrl="vm://localhost" username="${activemq .username}" password="${activemq.password}"/>156. -->157.158.159. <!-- An embedded servlet engine for serving up the Admin console -->160. <jetty xmlns="/schemas/jetty/1.0">161. <connectors>162. <nioConnector port="8161"/>163. </connectors>164.165. <handlers>166. <webAppContext contextPath="/admin" resourceBase="${activemq.base}/webapps/admin" logUrlOnStart="true"/ >167. <webAppContext contextPath="/demo" resourceBase="${activemq.base}/webapps/demo" logUrlOnStart="true"/ >168. <webAppContext contextPath="/fileserver" resourceBase="${activemq.base}/webapps/fileserver" logUrlOnStart= "true"/>169. </handlers>170. </jetty>171.172. <!-- This xbean configuration file supports all the standard spring xml configuration options -->173.174. <!-- Postgres DataSource Sample Setup -->175. <!--176. <bean id="postgres-ds"class="org.postgresql.ds.PGPoolingDataSource">177. <property name="serverName" value="localhost"/>178. <property name="databaseName" value="activemq"/>179. <property name="portNumber" value="0"/>180. <property name="user" value="activemq"/>181. <property name="password" value="activemq"/>182. <property name="dataSourceName" value="postgres"/>183. <property name="initialConnections" value="1"/>184. <property name="maxConnections" value="10"/>185. </bean>186. -->187.188. <!-- MySql DataSource Sample Setup -->189.190. <span style="color: #000000;"> </span><span style="color: #000000;"> <bean id="mysql-ds"class=" mons.dbcp.BasicDataSource" destroy-method="close">191. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>192. <property name="url" value="jdbc:mysql://localhost:3306/activemq?relaxAutoCommit=true"/>193. <property name="username" value="root"/>194. <property name="password" value=""/>195. <property name="maxActive" value="200"/>196. <property<strong> </strong>name="poolPreparedStatements" value="true"/>197. </bean></span>198.199.200. <!-- Oracle DataSource Sample Setup -->201. <!--202. <bean id="oracle-ds"class="mons.dbcp.BasicDataSource" destroy-method="close">203. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>204. <property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>205. <property name="username" value="scott"/>206. <property name="password" value="tiger"/>207. <property name="maxActive" value="200"/>208. <property name="poolPreparedStatements" value="true"/>209. </bean>210. -->211.212. <!-- Embedded Derby DataSource Sample Setup -->213. <!--214. <bean id="derby-ds"class="org.apache.derby.jdbc.EmbeddedDataSource">215. <property name="databaseName" value="derbydb"/>216. <property name="createDatabase" value="create"/>217. </bean>218. -->219.220. </beans>221. <!-- END SNIPPET: example -->改动部分主要是设置了mysql的datasource声明, 还有就是采⽤mysql作为persistenceAdapter,并声明如下。

pojo和javabean的区别

pojo和javabean的区别
ain Ordinary Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,有时可以作为value object或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
JavaBean 是一种JAVA语言写成的可重用组件。它的方法命名,构造及行为必须符合特定的约定:
1. 这个类必须有一个公共的缺省构造函数。
2. 这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范。
3. 这个类应是可序列化的。
因为这些要求主要是靠约定而不是靠实现接口,所以许多开发者把JavaBean看作遵从特定命名约定的POJO。
简而言之,当一个Pojo可序列化,有一个无参的构造函数,使用getter和setter方法来访问属性时,他就是一个JavaBean。
我的整理与总结:
一、对于java bean,就是一个java模型组件,他为使用java类提供了一种标准的格式,在用户程序和可视化管理工具中可以自动获得这种具有标准格式的类的信息,并能够创建和管理这些类。
2. 实现预定的接口,如 public class Bar implements javax.ejb.EntityBean { ...
3. 包含预定的标注,如 @javax.ejb.Entity public class Baz{ ...
然后,因为技术上的困难及其他原因,许多兼容POJO风格的软件产品或框架事实上仍然要求使用预定的标注,譬如用于更方便的持久化。

Docker容器如何持久化存储数据?

Docker容器如何持久化存储数据?

Docker容器如何持久化存储数据?在当今的云计算和容器化技术盛行的时代,Docker 容器已经成为了部署应用程序的一种非常流行的方式。

然而,对于许多开发者和运维人员来说,如何在 Docker 容器中实现数据的持久化存储是一个重要且具有挑战性的问题。

首先,我们需要明白为什么 Docker 容器中的数据持久化存储是必要的。

Docker 容器本质上是短暂的、临时性的。

当一个容器停止或被删除时,其内部产生的任何数据,如果没有进行特殊处理,也会随之丢失。

这对于一些需要保存用户数据、配置信息、日志等关键数据的应用来说,显然是不可接受的。

那么,Docker 容器有哪些常见的持久化存储方式呢?一种常见的方法是使用数据卷(Data Volumes)。

数据卷是 Docker管理的目录或文件,可以绕过容器的文件系统,直接将数据存储在宿主机上。

这意味着即使容器停止或被删除,数据卷中的数据仍然存在。

创建数据卷非常简单,我们可以在运行容器时使用`v` 选项来指定。

例如,`docker run v /my_data:/data my_image` ,这样就将宿主机上的`/my_data` 目录挂载到了容器内的`/data` 目录,容器内对`/data` 目录的读写操作都会反映在宿主机的`/my_data` 目录中。

另一种方式是使用绑定挂载(Bind Mounts)。

与数据卷类似,绑定挂载也是将宿主机上的目录或文件挂载到容器中。

但不同的是,绑定挂载使用的是宿主机上已存在的目录或文件,而不是由 Docker 管理。

例如,`docker run v /home/user/data:/data my_image` ,这里直接将宿主机上`/home/user/data` 目录挂载到了容器内的`/data` 目录。

除了上述两种方式,还可以使用 Docker 持久化存储插件。

一些常见的插件如`Rancher Longhorn` 、`Portworx` 等,它们提供了更强大的功能,如数据复制、快照、加密等。

itransientdependency 单例 同时使用

itransientdependency 单例 同时使用

itransientdependency 单例同时使用什么是itransientdependency 单例?itransientdependency 单例是一种设计模式,被广泛应用于软件开发领域。

在该模式中,itransientdependency 是指具有短暂生命周期的依赖关系,而单例则指生成对象的模式,保证在整个应用中只有一个实例。

itransientdependency 单例模式的概念起源于面向对象编程的设计模式,它的核心思想是通过管理和控制对象的生成和使用,来优化系统性能和资源利用。

它适用于那些在整个应用程序生命周期中只需要一个实例的对象,同时也需要频繁地使用的对象。

为什么要使用itransientdependency 单例?使用itransientdependency 单例的主要目的是减少系统中重复创建对象的开销,同时用单一实例来管理对某个对象的访问。

这种方式可以有效地减少内存消耗,提高运行效率,降低系统的复杂度。

具体而言,使用itransientdependency 单例模式可以带来以下好处:1. 减少资源消耗:系统只需创建一个实例,避免了重复创建相同对象的开销,节省了内存资源。

2. 简化代码:使用itransientdependency 单例模式可以简化代码结构,提高代码的可读性和可维护性。

只需在一个地方创建和管理实例,避免了在多个地方进行对象的初始化和配置。

3. 提高性能:由于不需要每次都创建实例,可以有效地提高系统的响应速度和执行效率。

4. 保持状态:在itransientdependency 单例模式中,单例对象的状态会被保持在整个应用程序的生命周期中,方便在不同模块或组件之间共享数据。

itransientdependency 单例模式如何实现?要实现itransientdependency 单例模式,可以按照以下步骤进行:1. 创建一个私有的静态成员变量实例,用于存储单例对象的引用。

iservice saveorupdate()方法

iservice saveorupdate()方法

iservice saveorupdate()方法iService saveOrUpdate()方法是一种基于Java开发的通用实体的持久化方法,它可以实现增加、修改、删除、查询等功能,常常被用于ORM框架中。

在进行实际开发过程中,我们需要掌握该方法的使用步骤,下面我们将详细介绍:步骤一:建立对应的实体类首先我们需要建立一个对应的实体类,该实体类应该继承自持久化基类,同时必须具有一个私有的序列化标识符。

在建立实体类的过程中,我们需要根据对应数据库表结构,定义各种属性和对应的getter、setter方法。

步骤二:在spring配置文件中定义所需的bean在spring配置文件中我们要定义相关的bean,包括会话工厂(sessionFactory)、事务管理器(transactionManager)、iService服务对象(service)等,其中iService服务对象是通过依赖注入技术来实现的。

步骤三:构建iService服务方法在iService服务中我们需要定义一系列方法,其中包括增加(add)、修改(update)、删除(delete)和查询(find)等操作。

在实现这些操作时,我们需要利用NamedQuery方式,通过对应的hql语句来操作数据库。

步骤四:调用saveOrUpdate()方法实现数据持久化在具体的实现过程中,我们需要以iService服务对象为入口,调用saveOrUpdate()方法来实现数据的持久化。

需要注意的是,saveOrUpdate()方法有两种情况:(1)如果该条记录不存在,则保存为新记录。

(2)如果该条记录已经存在,则更新该条记录。

在调用saveOrUpdate()方法之前,我们需要先通过iService服务对象的find方法,从数据库中查询出指定的记录,并将需要修改的属性进行修改,然后再调用saveOrUpdate()方法完成数据更新操作。

总之,iService saveOrUpdate()方法是一种较为方便、灵活、高效的数据持久化操作方式,能够帮助我们提高开发效率,加速项目开发周期。

pinia-plugin-persistedstate序列化部分参数

pinia-plugin-persistedstate序列化部分参数

pinia-plugin-persistedstate序列化部分参数介绍如下:在使用pinia-plugin-persistedstate插件进行数据持久化时,可以通过指定参数序列化器来序列化部分参数。

在插件的配置中,可以使用serializer对象来自定义序列化和反序列化的逻辑。

具体来说,可以设置serialize和deserialize两个函数,这两个函数分别用于参数的序列化和反序列化。

例如,假设我们有一个参数对象,其中包含了一些敏感信息,我们不希望将这些信息存储在本地存储中,可以只序列化对象的非敏感属性。

可以在serialize函数中进行判断,只序列化对象的非敏感属性。

```javascriptimport { createPinia } from 'pinia';import { createPersistedState } from 'pinia-plugin-persistedstate';export const pinia = createPinia();e(createPersistedState({serializer: {serialize: (value) => {if (typeof value === 'object' && value !== null) {const { sensitiveData, ...otherData } = value;return otherData;}return value;},deserialize: (value) => {if (typeof value === 'object' && value !== null) {const { sensitiveData, ...otherData } = value;return { ...value, sensitiveData: '***' }; // 使用'***'代替敏感数据}return value;}}}));```在上面的代码中,serialize函数会将对象的敏感属性提取出来,只序列化其他属性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如果有数据文 件,先从数据 文件读取所有 学生数据;否 则就创建一个 空的学生列表
其它需要改变的地方
DAL只被BLL层调用
在BLL中不能直接创建DAL层对象,而要调用其静
态方法获取唯一实例 例:StudentDAL dal=new StudentDAL(); //X 应改成 StudentDAL dal=StudentDAL.GetStudentDAL();
用序列化+单例模式实现数据持久化
什么是序列化(Serialization)
序列化可被定义为将对象的状态存储到存储媒介中的
过程
序列化:对象的公共字段和私有字段以及类的名称(包
括包含该类的程序集)都被转换为字节流,然后写入数 据流 反序列化:创建原始对象的精确复本
为何使用序列化
将对象的状态永久保存在存储媒体中,以便可以在以后
//step1:定义一个支持序列化的类 [Serializable] public class MyObject { public int n1 = 0; public int n2 = 0; public String str = null; }
//step3:在需要时从文件中反序列化对象 IFormatter formatter = new BinaryFormatter(); Stream stream =new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read); MyObject obj = (MyObject) formatter.Deserialize(stream); stream.Close(); // Here's the proof. Console.WriteLine("n1: {0}", obj.n1); Console.WriБайду номын сангаасeLine("n2: {0}", obj.n2); Console.WriteLine("str: {0}", obj.str);
二进制序列化
BinaryFormatter可以非常有效地为对象生成简洁
的字节流 ,对于序列化将在 .NET Framework 上 被反序列化的对象而言十分理想(即不需要移 植) 在反序列化一个对象时不调用构造函数 如果需要可移植,需要用SoapFormatter 代替 Serializable 属性不能被继承,即使父类有这属性, 子类也必须手动添加,若一个对象中包含子对 象,子对象也必须是 Serializable
重新创建精确的副本 通过值将对象从一个应用程序域发送到另一个应用程序 域中
XML序列化
将对象序列化到 XML 文档中和从 XML 文档中反序
列化对象
对象中的数据是用编程语言构造来描述的,如类、字
段、属性 (Property)、基元类型、数组,甚至 XmlElement 或 XmlAttribute 对象形式的嵌入 XML XML 序列化仅将对象的公共字段和属性值序列化为 XML 流。XML 序列化不包括类型信息
基本序列化
所需引入的命名空间
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
将序列化用于教务管理系统(1)
需要为所有Model和DAL层的元素打上[Serializable]属
性标记
忘记为对象或对象的一部分打上标记会导致反序列
化出错,不能正确重构对象
将序列化用于教务管理系统(2)
在DataAccess类中实现所有动态数据的保存和读取
单例模式
教师会查询选课信息,故需要访问TermCourseDAL
对象; 学生要选课,也需要访问TermCourseDAL对象 如何保证他们访问的是同一个TermCourseDAL对象 以保持数据的一致性?
答案:单例模式——〉对同一个TermCourseDAL对
象进行操作
什么是单例模式
单例模式最要关心的则是对象创建的次数以及何时
被创建。 单例模式的要点有三个:
该类只能有一个实例;
该类必须自行创建这个实例;
类必须自行向整个系统提供这个实例。
例:获取单一的CourseDAL对象
//step2:将对象序列化到文件中 MyObject obj = new MyObject(); obj.n1 = 1; obj.n2 = 24; obj.str = "Some String"; IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None); formatter.Serialize(stream, obj); stream.Close();
相关文档
最新文档