天道酬勤,学无止境

java standard serialization order

I want to know in which order the attributes of the following example class would be serialized:

public class Example implements Serializable {

   private static final long serialVersionUID = 8845294179690379902L;

   public int score;
   public String name;
   public Date eventDate;
}

EDIT:

Why i wanna know this:

I got a serialized string in a file for a class of mine which has no implementation for readObject() or writeObject(). now that implementation changed ( some properties are gone ) and i want to write a readObject() method that handles the old serialized class.

There i would just read this property but wouldnt save it to the created object.

This is basically just for legacy i use a database now but need to support the old serialized files.

to write this readObject() i need the order of properties that in the stream.

评论

Based on a brief reading of the spec.

  • The fields are written in the order of the field descriptors the class descriptor

  • The field descriptors are in "canonical order" which is defined as follows:

    "The descriptors for primitive typed fields are written first sorted by field name followed by descriptors for the object typed fields sorted by field name. The names are sorted using String.compareTo."


(I suspect that the bit about the canonical order should not matter. The actual order of the fields in the serialization should be recoverable from the actual order of the field descriptors in the class descriptor in the same serialization. I suspect that the reason a canonical order is specified is that it affects the computed serialization id. But I could easily be wrong about this :-) )


Reference:

  • Java Object Serialization Specification - Section 4.3 and Section 6.4.1 (the comment on the "nowrclass" production)

With regards to your original problem, some testing would suggest that if you've maintained your serialVersionUID and haven't removed fields containing values you need, you can probably just deserialize your old objects without error.

Any fields you no longer have will be ignored. Any new fields will be initialised to default values (e.g. null, or 0 etc.).

Bear in mind, this approach might violate constraints you've placed upon your class. For example, it may not be legal (in your eyes) to have null values in your fields.

Final warning: this is based on some testing of mine and research on the Internet. I haven't yet encountered any hard proof that this is guaranteed to work in all situations, nor that it is guaranteed to continue to work in the future. Tread carefully.

It doesn't matter. Fields are serialized along with their names. Changing the order doesn't affect serialization compatibility, as long as the serialVersionUID is the same. There are a lot of other things that don't mater either. See the Versioning chapter in the Object Serialization Specification.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Order of XML attributes after DOM processing
    When processing XML by means of standard DOM, attribute order is not guaranteed after you serialize back. At last that is what I just realized when using standard java XML Transform API to serialize the output. However I do need to keep an order. I would like to know if there is any posibility on Java to keep the original order of attributes of an XML file processed by means of DOM API, or any way to force the order (maybe by using an alternative serialization API that lets you set this kind of property). In my case processing reduces to alter the value of some attributes (not all) of a
  • 基于dubbo框架下的RPC通讯协议性能测试
    一、前言  Dubbo RPC服务框架支持丰富的传输协议、序列化方式等通讯相关的配置和扩展。dubbo执行一次RPC请求的过程大致如下:消费者(Consumer)向注册中心(Registry)执行RPC请求,注册中心分配服务URL并路由到具体服务提供方(Provider),消费者和服务提供方建立网络连接,服务提供方在本地创建连接池对象并提供远程服务,对于长连接类型协议(如dubbo协议)将保持连接,减少握手认证,调用过程中可以避免频繁建立和断开连接导致的性能开销,保持长连接需要有心跳包的发送,所以对于非频繁调用的服务保持连接同样会有消耗。 dubbo共支持如下几种通信协议:dubbo://rmi://hessian://http://webservice://thrift://memcached://redis://部分协议的特点和使用场景如下:1、dubbo协议Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。 连接个数:单连接 连接方式:长连接 传输协议:TCP 传输方式:NIO异步传输 序列化:Hessian二进制序列化 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多
  • 面试官:为什么synchronized无法禁止指令重排,却能保证有序性?
    转载公众号:Hollis 前几天有一位读者找我问一个问题,说是这道题可能影响了他接下来3年的技术成长。 据说这位读者前面的很多问题会的都还可以,属于那种可过可不过的类型的,面试官出了最后一道题,就是回答的满意就可以给Offer,回答的不好就不让过的意思。 那么这道题到底应该如何回答呢? 首先我们要分析下这道题,不得不说这个面试官还是有一定的水平的,这简单的一个问题,其实里面还是包含了很多信息的,要想回答好这个问题,面试者至少要知道一下概念: Java内存模型、并发编程有序性问题、指令重排、synchronized锁、可重入锁、排它锁、as-if-serial语义、单线程&多线程 所以,这道题的正确回答姿势是怎样的呢? 标准答案如下: 这是个好问题,这个问题我曾经也思考过,也查阅过很多资料,甚至还去看过hotsopt的源码。 不管三七二十一,上来先舔一波,然后表示下自己求知好学的态度。 为了进一步提升计算机各方面能力,在硬件层面做了很多优化,如处理器优化和指令重排等,但是这些技术的引入就会导致有序性问题。 先告诉面试官你知道什么是有序性问题,也知道是什么原因导致的有序性问题 我们也知道,最好的解决有序性问题的办法,就是禁止处理器优化和指令重排,就像volatile中使用内存屏障一样。 表明你知道啥是指令重排,也知道他的实现原理 但是,虽然很多硬件都会为了优化做一些重排
  • Java 集合框架 详解
    一、Java 集合框架概述 集合框架是一个用来代表和操纵集合的统一架构(java集合框架位于java.util包中)。所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。 Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。 Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,集合框架中常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。 二、Java 集合框架详解 下面逐个进行介绍: 2.1 集合接口 集合框架定义了一些接口。本节提供了每个接口的概述: 序号接口描述1Collection 接口 Collection
  • 基于springboot的校园二手推荐、二手交易登录、注册、搜索、推荐、公告、商品列表、后台信息管理-ssm-javaweb-springmvc计算机毕业设计
    0、效果展示 1、概述 前台用户: 用户注册:用户进入网站后可以注册成为网站用户; 用户登录:用户注册成为会员后输入用户名和密码后登录网站可以进行相关操作; 个人信息:该模块的功能有我的留言板、修改密码、收货地址管理、我收藏的商品、我的购物篮;我的订单; 后台管理: 用户管理:该模块的主要功能是会员管理; 新闻管理:该模块的主要功能有添加新闻、新闻类型管理、新闻列表; 商品管理:该模块的主要功能有发布商品、商品类型管理、商品列表、订单管理; 系统设置:该模块的主要功能有评论管理、系统设置 修改密码:该模块主要是修改密码。 2、搭建环境 本文以实现一个线上管理系统为目标,从环境搭建到编码实现全过程讲述 我们使用javaweb、J2EE来构建信息管理平台,环境使用最新版jdk和tomcat,配合mysql数据库 开发工具使用idea(也可以使用eclipse),数据库管理工具使用Navicat Premium 开发框架使用JavaBean Servlet MVC结构; 没有使用SSH(Struts+Spring+Hibernate)或SSM(Spring+SpringMVC+MyBatis),这两个框架我们在别的项目中再介绍开发过程 在项目中会引入My97DatePicker作为前端日期时间选择工具,使用fckeditor作为富媒体编辑器(也可以使用百度的ueditor) 使用DWR
  • 子spring对象与其超级java.util对象之间的显式类型转换(Explicit type conversion between child spring object, and it's super java.util object)
    问题 在春季,我使用的是jdbcTemplate,但是有一个问题,当查询列表时,它会返回Linkedcaseinsensitivemap,即使执行以下操作,我仍然会获得spring linkedcaseinsensitivemap,即使我将其强制转换为java util List并定义了左侧分配为java.util.List。 首先,那怎么可能? final java.util.List<Map<String, Object>> list = (java.util.List<Map<String, Object>>) jdbc .queryForList("SELECT * FROM customer"); 那么,一个实现者会如何进行这种up割呢? 无需声明第二个列表为其分配内存,然后将对象手动放入java.util.List? 由于LinkedCaseInsensitive是java对象的子类,因此Im很难确定如何将其强制转换为java List的超级对象。 目前,如何实现这一目标仍是一个谜。 由于目前无法知道哪些代理将使用我们的 AMQ,目标过于严格地保留 jms 对象,所以我无法开始发送 spring 对象,因为 jms 应该是我们的标准,也请注意我没有实现AMQProtocol的选项,我需要发送基本的Java对象, 由于建议使用序列化到JSON
  • 最详细的Java知识点--缓冲流、转换流、序列化流、打印流
    缓冲流、转换流、序列化流、打印流主要内容缓冲流转换流序列化流打印流目标能够使用字节缓冲流读取数据到程序能够使用字节缓冲流写出数据到文件能够明确字符缓冲流的作用和基本用法能够使用缓冲流的特殊功能能够阐述编码表的意义能够使用转换流读取指定编码的文本文件能够使用转换流写入指定编码的文本文件能够说出打印流的特点能够使用序列化流写出对象到文件能够使用反序列化流读取文件到程序中第一章 缓冲流昨天学习了基本的一些流,作为IO流的入门,今天我们要见识一些更强大的流。比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的序列化流等等。这些功能更为强大的流,都是在基本的流对象基础之上创建而来的,就像穿上铠甲的武士一样,相当于是对基本流对象的一种增强。1.1 概述缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类:字节缓冲流:BufferedInputStream,BufferedOutputStream字符缓冲流:BufferedReader,BufferedWriter缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。1.2 字节缓冲流构造方法public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。public
  • fastjson使用详解
    文章目录 1. 简介2 下载3. 特性Fastjson 特性 4.使用范例4.1 将Java格式转化为Json对象@JSONField使用详解使用format配置日期格式化使用 serialize/deserialize 指定字段不序列化使用 ordinal 指定字段的顺序 @JSONField作用对象@JSONField 配置方式配置在 getter/setter 上**配置在 field 上** FastJson 还支持 BeanToArray 序列化功能 4.2 创建 JSON 对象4.3 JSON 字符串转换为 Java 对象4.4 使用 ContextValueFilter 配置 JSON 转换4.5 使用 NameFilter 和 SerializeConfig 参考资料更新记录 1. 简介 markdown笔记下载地址 查阅 Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN 2 下载 eclipse JavaEE平台下载及使用: 下载jar包。最新版jar包下载;导入jar包。将jar包复制到需要使用json的工程中;详细步骤请参考这里 你可以在maven中央仓库中直接下载: http://repo1.maven.org/maven2/com/alibaba
  • 《Effective Java》真的是一本值得一直去钻研的好书
    文章目录 《Effective Java》读书笔记第一章 引言第二章 创建和销毁对象1 考虑使用静态工厂方法替代构造方法**2 当构造方法参数过多时使用builder(建造者) 模式**3 使用私有构造方法或枚类实现Singleton 属性*4 使用私有构造方法执行非实例化*5 依赖注入优于硬连接资源(hardwiring resources)**6 避免创建不必要的对象*7 消除过期的对象引用*8 避免使用Finalizer 和Cleaner 机制**9 使用try-with-resources 语句替代try-finally 语句** 第三章 对于所有对象都通用的方法10 重写equals 方法时遵守通用约定*11 重写equals 方法时同时也要重写hashcode 方法*12 始终重写toString 方法*13 谨慎地重写clone 方法**14 考虑实现Comparable 接口*** 第四章 类和接口15 使类和成员的可访问性最小化*16 在公共类中使用访问方法而不是公共属性*17 最小化可变性*18 组合优于继承***19 要么设计继承并提供文档说明,要么禁用继承**20 接口优于抽象类**21 为后代设计接口**22 接口只用于定义类型*23 类层次优于标签类***24 静态成员类优于非静态成员类**25 限制原文件为单个顶级类*** 第五章 泛型第26 条
  • PostgreSQL串行类型的Hibernate批注(Hibernate annotation for PostgreSQL serial type)
    问题 我有一个PostgreSQL表,其中有一个列inv_seq声明为serial 。 我有一个Hibernate bean类来映射表。 除此列外,所有其他列均可以正确读取。 这是Hibernate bean类中的声明: .... .... @GeneratedValue(strategy=javax.persistence.GenerationType.AUTO) @Column(name = "inv_seq") public Integer getInvoiceSeq() { return invoiceSeq; } public void setInvoiceSeq(Integer invoiceSeq) { this.invoiceSeq = invoiceSeq; } .... .... 声明正确吗? 我能够看到数据库中该列生成的顺序号,但是我无法在java类中访问它们。 请帮忙。 回答1 危险:您的问题暗示您可能犯了一个设计错误-您试图将数据库序列用于呈现给用户的“业务”值,在本例中为发票编号。 如果您只需要测试值的相等性,就不要使用序列。 它没有命令。 它与另一个值没有“距离”。 它是相等的或不相等的。 回滚:序列通常不适用于此类用途,因为对序列的更改不会通过事务ROLLBACK 。 有关功能序列和创建序列的信息,请参见页脚。 回滚是正常现象。 它们的发生是由于:
  • Java的序列化如何工作以及何时应使用它来代替某些其他持久性技术?(How does Java's serialization work and when it should be used instead of some other persistence technique?)
    问题 我最近一直在尝试学习更多信息,并且通常在工作项目和个人项目中测试Java的序列化,我必须说,我对它的了解越多,我就越不喜欢它。 但是,这可能是由错误信息引起的,所以这就是为什么我要向大家询问以下两件事: 1:在字节级别,序列化如何知道如何将序列化的值与某个类匹配? 我这里的问题之一是,我对ArrayList进行了一个小测试,其中包含值“一个”,“两个”,“三个”。 序列化后,字节数组占用了78个字节,对于如此低的信息量(19 + 3 + 3 + 4字节)而言,这似乎是一个很大的数目。 当然会有一定的开销,但这引出了我的第二个问题: 2:是否可以将序列化视为持久存储对象的好方法? 现在很明显,如果我使用一些自制的XML格式,则持久性数据将是这样的 <object> <class="java.util.ArrayList"> <!-- Object array inside Arraylist is called elementData --> <field name="elementData"> <value>One</value> <value>Two</value> <value>Three</value> </field> </object> 与一般的XML一样,它有点肿,占用138个字节(即没有空格)。 JSON中的可能是 { "java.util.ArrayList"
  • 2021最新java基础疯狂刷题全集,Java入门的好帮手,更是java面试笔试必刷的经典习题讲解
    目录 一,JAVA 基础1,JAVA 异常分类及处理2,异常分类3,异常的处理方式4,Throw 和 throws 的区别 二,JAVA 反射1,动态语言2,反射机制概念 (运行状态中知道类所有的属性和方法)3,反射的应用场合4,Java 反射 API5,反射使用步骤(获取 Class 对象、调用对象方法)6,获取 Class 对象的 3 种方法7,创建对象的两种方法 三,JAVA 注解1,概念2,4 种标准元注解3,注解处理器 四,JAVA 内部类1,静态内部类2,成员内部类3,局部内部类(定义在方法中的类)4,匿名内部类(要继承一个父类或者实现一个接口、直接使用,new 来生成一个对象的引用) 五,JAVA 泛型1,泛型方法()2,泛型类3,类型通配符?4,类型擦除 六,JAVA 序列化(创建可复用的 Java 对象)1,保存(持久化)对象及其状态到内存或者磁盘2,序列化对象以字节数组保持-静态成员不保存3,序列化用户远程对象传输4,序列化 ID5,Transient 关键字阻止该变量被序列化到文件中 七,JAVA 复制1,直接赋值复制2,浅复制(复制引用但不复制引用的对象)3,深复制(复制对象和其应用对象)4,序列化(深 clone 一中实现) 一,JAVA 基础 1,JAVA 异常分类及处理 概念 如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法
  • Java时间序列化机制解析
    ​ LocalDateTime是Java 8开始提供的时间日期API,主要用来优化Java 8以前对于时间日期的处理操作。在使用Spring Boot的时候,往往会发现请求参数或返回结果中含有LocalDateTime等Java 8时间字段的时候会发生各种问题。下文就时间字段各种问题进行描述,并提供相关原理和解决方案。 举例的实体信息 import lombok.Data; import java.time.LocalDateTime; import java.util.Date; @Data public class Book { private String id ; private String name; private Date createtime; private LocalDateTime updatetime; } 对应的controller请求 @GetMapping("/books") public Book listBook() { Book book =new Book(); book.setId("11"); book.setName("语文"); book.setCreatetime(new Date()); book.setUpdatetime(LocalDateTime.now()); return book; } 1
  • gwt-使用清单在RPC调用中?(gwt - Using List<Serializable> in a RPC call?)
    问题 我有以下方法的RPC服务: public List<Serializable> myMethod(TransactionCall call) {...} 但是在分析此方法时收到警告,然后rpc调用失败 Analyzing 'my.project.package.myService' for serializable types Analyzing methods: public abstract java.util.List<java.io.Serializable> myMethod(my.project.package.TransactionCall call) Return type: java.util.List<java.io.Serializable> [...] java.io.Serializable Verifying instantiability (!) Checking all subtypes of Object which qualify for serialization 看来我不能为列表使用Serializable ...我可以改用我自己的接口(类似于AsyncDataInterface,它实现Serializable接口),但事实是我的方法将返回列表自定义对象和基本对象(例如如Strings,int ....)。 所以我的问题是:
  • 谁设计/设计了C ++的IOStreams,并且按照当今的标准,它仍然被认为设计良好吗? [关闭](Who architected / designed C++'s IOStreams, and would it still be considered well-designed by today's standards? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 首先,似乎我在征求主观意见,但这并不是我所追求的。 我很想听听有关该主题的一些有充分根据的论点。 为了对如何设计现代流/序列化框架有所了解,我最近从Angelika Langer和Klaus Kreft手中买了《 Standard C ++ IOStreams and Locales》一书。 我认为,如果IOStreams的设计不当,那么它首先就不会进入C ++标准库。 阅读本书的各个部分之后,我开始怀疑IOStreams是否可以从总体体系结构的角度与STL进行比较。 阅读例如对Alexander Stepanov(STL的“发明人”)的采访,以了解有关STL的一些设计决策。 特别令我惊讶的是: 谁来负责IOStreams的总体设计似乎是个未知数(我很想阅读有关此的一些背景信息-有人知道好的资源吗?); 深入研究IOStreams的直接表面之后(例如,如果您想使用自己的类扩展IOStreams),您将获得一个具有相当隐秘且令人困惑的成员函数名称的接口,例如getloc / imbue , uflow / underflow , snextc / sbumpc / sgetc / sgetn , pbase /
  • 深度克隆实用程序推荐[关闭](Deep clone utility recommendation [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 6年前关闭。 改善这个问题 是否有用于深度克隆Java集合的实用程序: 数组清单地图 注意:首选一些不使用序列化但使用Object.clone()方法的解决方案。 我可以确定我的自定义对象将实现clone()方法,并且仅使用可复制的Java标准类。 回答1 我认为以前的绿色答案很不好,您为什么会问? 它添加了很多代码它要求您列出所有要复制的字段并执行此操作当使用clone()时,这对列表不起作用(这是HashMap的clone()所说的:返回此HashMap实例的浅表副本:键和值本身不会被克隆。)因此您最终需要手动进行操作(这使得我哭了) 哦,顺便说一句,序列化也很糟糕,您可能必须在各处添加Serializable(这也让我哭了)。 那么解决方案是什么: Java深度克隆库克隆库是一个小型的,开源的(Apache许可证)Java库,用于深度克隆对象。 对象不必实现Cloneable接口。 实际上,该库可以克隆任何java对象。 如果您不希望修改缓存的对象,或者每当要创建对象的深层副本时,都可以在缓存实现中使用它。 Cloner cloner=new Cloner(); XX clone = cloner.deepClone
  • 当请求com端口返回相同的请求时(When requesting com port returns the same request)
    问题 我正在尝试通过COM端口发送AT命令,但是只重新发送了相同的命令。 package SerialConnections; import jssc.SerialPort; import jssc.SerialPortEvent; import jssc.SerialPortEventListener; import jssc.SerialPortException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static ru.telemetria.qa.utils.Utilities.waitTime; public class M234Serial { private static Logger log = LoggerFactory.getLogger(M234Serial.class); private SerialPort serialPort; private byte[] receivedData; private boolean isReceived; public M234Serial() throws Exception { serialPort = new SerialPort("COM55"); } public void sendCommand() throws
  • 关于序列化的 10 几个问题,你顶得住不?
    任何序列化该类的尝试都会因NotSerializableException而失败,但这可以通过在 Java中 为 static 设置瞬态(transient)变量来轻松解决。Java 序列化相关的常见问题Java 序列化是一个重要概念, 但它很少用作持久性解决方案, 开发人员大多忽略了 Java 序列化 API。根据我的经验, Java 序列化在任何 Java核心内容面试中都是一个相当重要的话题, 在几乎所有的网面试中, 我都遇到过一两个 Java 序列化问题, 我看过一次面试, 在问几个关于序列化的问题之后候选人开始感到不自在, 因为缺乏这方面的经验。他们不知道如何在 Java 中序列化对象, 或者他们不熟悉任何 Java 示例来解释序列化, 忘记了诸如序列化在 Java 中如何工作, 什么是标记接口, 标记接口的目的是什么。瞬态变量和可变变量之间的差异, 可序列化接口具有多少种方法, 在 Java 中,Serializable 和Externalizable 有什么区别, 或者在引入注解之后, 为什么不用 @Serializable 注解或替换Serializalbe 接口。在本文中,我们将从初学者和高级别进行提问, 这对新手和具有多年 Java 开发经验的高级开发人员同样有益。关于Java序列化的10个面试问题大多数商业项目使用数据库或内存映射文件或只是普通文件,
  • ActiveMQ消息中间件与JMS
    一.什么是消息中间件二.消息中间件的使用场景1.解耦2.流量消锋:3.异步处理:*.消息通讯搭建ActiveMQ 三、JMS简介1.什么是JMS2. JMS消息传递类型 一.什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者) 常见的消息中间件产品: (1)ActiveMQ ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现。 (2)RabbitMQ AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。 (3)ZeroMQ 史上最快的消息队列系统 (4)Kafka Apache下的一个子项目。特点:高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统。适合处理海量数据。 二.消息中间件的使用场景 消息中间件一般使用场景有3个: 1.解耦 2.流量消锋 3.异步处理 (*)消息通讯 1.解
  • Spark 性能优化(翻译)
    原文太长,提炼关键点 数据序列化 (Kryo更快,使用SparkConf初始化作业并调用conf.set(“ spark.serializer”,“ org.apache.spark.serializer.KryoSerializer”)来切换为使用Kryo)内存调优 内存管理概述确定内存消耗( 确定数据集所需的内存消耗量的最佳方法是创建一个RDD,将其放入缓存中,然后查看Web UI中的“ Storage”页面。该页面将告诉您RDD占用了多少内存。 要估算特定对象的内存消耗,请使用SizeEstimator的估算方法。 )调整数据结构序列化RDD存储垃圾收集优化 其他注意事项 并行度减少任务的内存使用广播大变量数据局部性 原文如下 http://spark.apache.org/docs/latest/tuning.html 数据序列化 序列化在任何分布式应用程序的性能中都起着重要作用。将对象慢速序列化或占用大量字节将大大减慢计算速度。通常,这是您应该优化Spark应用程序的第一件事。 Spark旨在在便利性(允许您在操作中使用任何Java类型)和性能之间取得平衡。它提供了两个序列化库: Java序列化:默认情况下,Spark使用Java的ObjectOutputStream框架对对象进行序列化,并且可以与您创建的实现java.io.Serializable的任何类一起使用