精华内容
下载资源
问答
  • kryo

    2017-08-23 23:45:00
    测试kryo与jdk的ObjectOutputStream kryo常用设置 InstantiatorStrategy即初始化策略,默认kryo在反序列化对象时需要对象的类有一个零参数构造器,该构造器可以是private的,kryo通过反射调用该构造器来...
     
    测试kryo与jdk的ObjectOutputStream

     

     

    kryo常用设置

    InstantiatorStrategy即初始化策略,默认kryo在反序列化对象时需要对象的类有一个零参数构造器,该构造器可以是private的,kryo通过反射调用该构造器来实例化对象。如果没有这样一个构造器,就需要使用kryo.setInstantiatorStrategy(new StdInstantiatorStrategy())了,该策略通过jvm api创建对象,这会创建一个完全空的对象(即不执行任何代码中的初始化工作),如果对象在实例化时需要一些初始化操作(比如在构造代码块中执行一些计算逻辑),这种策略就不可行了。
    比较好的策略是kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));,即先尝试通过零参数构造实例化对象,如果类中没有零参数构造器,则会使用StdInstantiatorStrategy策略。
     
    References即引用,对A对象序列化时,默认情况下kryo会在每个成员对象第一次序列化时写入一个数字,该数字逻辑上就代表了对该成员对象的引用,如果后续有引用指向该成员对象,则直接序列化之前存入的数字即可,而不需要再次序列化对象本身。这种默认策略对于成员存在互相引用的情况较有利,否则就会造成空间浪费(因为没序列化一个成员对象,都多序列化一个数字),通常情况下可以将该策略关闭,kryo.setReferences(false);
     
    Registration即注册,kryo在序列化对象时,首先会序列化其类的全限定名,由于我们通常序列化的对象都是有限范围内的类的实例,这样重复序列化同样的类的全限定名是低效的。通过注册kryo可以将类的全限定名抽象为一个数字,即用一个数字代表全限定名,这样就要高效一些。kryo.register(SomeClass.class);,注册方法的完整签名为public Registration register (Class type, Serializer serializer, int id),我们通常只需要使用其重载方法即可public Registration register (Class type),serializer和id在kryo内部会指定。
     
    PS:使用kryo序列化时,可以使用transient关键字忽略某字段。
     

    序列化方法

    kryo大体有三种序列化方法,每种方式都有其优势和劣势。
    1,kryo.writeObject,这种方法只会序列化对象实例,而不会记录对象所属类的任何信息。优势是最节省空间,劣势是在反序列化时,需要提供类作为模板才能顺利反序列。反序列化时使用readObject。
    2,直接kryo.writeClassAndObject,这种方法会先将对象所属类的全限定名序列化,然后再依次序列化对象实例的成员。优势是完全动态序列化,整个kryo周期都不需要提供类信息。反序列化时使用readClassAndObject
    3,先注册,再kryo.writeClassAndObject,这种方式时最理想的,其结合了前两种优势,又有效规避了劣势,事先将需要序列化的类注册给kryo(此时类和唯一id绑定),之后使用writeClassAndObject序列化时,只会序列化注册id,而不会序列化类的全限定名了,这样大大节省了空间(通常只比writeObject多一个字节)。反序列化时使用readClassAndObject。注意序列化和反序列的kryo的注册信息应当保持一致。
     

    Example

     1 public class Simple {  
     2  private String name;  
     3  private int age;  
     4  
     5  
     6  public String getName() {  
     7    return name;  
     8  }  
     9  
    10   public void setName(String name) {  
    11     this.name = name;  
    12   }  
    13   
    14   public int getAge() {  
    15     return age;  
    16   }  
    17   
    18   public void setAge(int age) {  
    19     this.age = age;  
    20   }  
    21   
    22   static Simple getSimple() {  
    23     Simple simple = new Simple();  
    24     simple.setAge(10);  
    25     simple.setName("zhang3");  
    26     return simple;  
    27   }  
    28 }

     

    1 Kryo kryo = new Kryo();  
    2 kryo.setReferences(false);  
    3 kryo.setRegistrationRequired(false);  
    4 kryo.setInstantiatorStrategy(new StdInstantiatorStrategy());  
    5 Output output = new Output(new FileOutputStream("file.bin"));
    6 kryo.writeClassAndObject(output, Simple.getSimple());  
    7 output.close();

     

     

    红色框内,第一个字节代表classId,也就是kryo中注册的id,01表示未注册,第二个字节代表nameId;

    绿色框内为类的全限定名;

    紫色框内,唯一的一个字节14表示age属性值10(cryo为了优化存储,定义了自己的映射关系);

    粉色框内表示字符串“zhang3”,其中字符串“zhang”可以与asc码一一对应,最后一个字符“3”这里为B3就有些匪夷所思了,与14表示10类似,kryo对字符串也做了优化,这样可以省去表示长度的字节序列(具体优化策略就不探究了)。

    如果序列化时,Sample中字段的顺序是age、name,反序列化时,Sample中字段的顺序是name、age,这样会不会有问题呢?

    不会有问题,kryo在序列化、反序列前对字段进行了排序,kryo的序列化、反序列化顺序与字段声明顺序无关。

    转载于:https://www.cnblogs.com/holoyong/p/7420880.html

    展开全文
  • Kryo

    2016-03-10 16:05:00
    Kryo 是一个快速高效的Java对象图形序列化框架,它原生支持java,且在java的序列化上甚至优于google著名的序列化框架protobuf。由于protobuf需要编写Schema文件(.proto),且需静态编译。故选择与Kryo类似的序列化...

    Kryo 是一个快速高效的Java对象图形序列化框架,它原生支持java,且在java的序列化上甚至优于google著名的序列化框架protobuf。由于protobuf需要编写Schema文件(.proto),且需静态编译。故选择与Kryo类似的序列化框架Hessian作为比较来了解一下Kryo为什么这么快。

    序列化的过程中主要有3个指标:

    1、对象序列化后的大小

    一个对象会被序列化工具序列化为一串byte数组,这其中包含了对象的field值以及元数据信息,使其可以被反序列化回一个对象

    2、序列化与反序列化的速度

    一个对象被序列化成byte数组的时间取决于它生成/解析byte数组的方法

    3、序列化工具本身的速度

    序列化工具本身创建会有一定的消耗。

    1、Kryo序列化后比Hessian小很多。(kryo优于hessian)

    2、由于Kryo没有将类field的描述信息序列化,所以Kryo需要以自己加载该类的filed。这意味着如果该类没有在kryo中注册,或者该类是第一次被kryo序列化时,kryo需要时间去加载该类(hessian优于kryo)

    3、由于2的原因,如果该类已经被kryo加载过,那么kryo保存了其类的信息,就可以很快的将byte数组填入到类的field中,而hessian则需要解析序列化后的byte数组中的field信息,对于序列化过的类,kryo优于hessian。

    4、hessian使用了固定长度存储int和long,而kryo则使用的变长,实际中,很大的数据不会经常出现。(kryo优于hessian)

    5、hessian将序列化的字段长度写入来确定一段field的结束,而kryo对于String将其最后一位byte+x70用于标识结束(kryo优于hessian)

     

     

    展开全文
  • Kryo

    2017-12-30 00:45:00
    这意味着如果该类没有在kryo中注册,或者该类是第一次被kryo序列化时,kryo需要时间去加载该类(hessian优于kryo) 3、由于2的原因,如果该类已经被kryo加载过,那么kryo保存了其类的信息,就可以很快的将byte...
    Kryo 博客分类: java

    Kryo 是一个快速高效的Java对象图形序列化框架,它原生支持java,且在java的序列化上甚至优于google著名的序列化框架protobuf。由于protobuf需要编写Schema文件(.proto),且需静态编译。故选择与Kryo类似的序列化框架Hessian作为比较来了解一下Kryo为什么这么快。

    序列化的过程中主要有3个指标:

    1、对象序列化后的大小

    一个对象会被序列化工具序列化为一串byte数组,这其中包含了对象的field值以及元数据信息,使其可以被反序列化回一个对象

    2、序列化与反序列化的速度

    一个对象被序列化成byte数组的时间取决于它生成/解析byte数组的方法

    3、序列化工具本身的速度

    序列化工具本身创建会有一定的消耗。

    1、Kryo序列化后比Hessian小很多。(kryo优于hessian)

    2、由于Kryo没有将类field的描述信息序列化,所以Kryo需要以自己加载该类的filed。这意味着如果该类没有在kryo中注册,或者该类是第一次被kryo序列化时,kryo需要时间去加载该类(hessian优于kryo)

    3、由于2的原因,如果该类已经被kryo加载过,那么kryo保存了其类的信息,就可以很快的将byte数组填入到类的field中,而hessian则需要解析序列化后的byte数组中的field信息,对于序列化过的类,kryo优于hessian。

    4、hessian使用了固定长度存储int和long,而kryo则使用的变长,实际中,很大的数据不会经常出现。(kryo优于hessian)

    5、hessian将序列化的字段长度写入来确定一段field的结束,而kryo对于String将其最后一位byte+x70用于标识结束(kryo优于hessian)

     

     

    转载于:https://my.oschina.net/xiaominmin/blog/1597952

    展开全文
  • final Kryo kryo = new Kryo(); kryo.setAsmEnabled(true); kryo.register(EnumMap.class, new EnumMapSerializer()); final FieldSerializer<blah> blahSerializer = new FieldSerializer<>...
  • Kryo serializer

    2020-12-30 03:41:57
    This is pretty much straight port of json serialiser to kryo. Main problems: - <code>kryo.setReferences(false);</code> without it entity references do not work, as all entities are loaded before bags...
  • Kryo 2.23

    2021-01-12 06:23:09
    <div><p>Any timeline to release 2.23? Trunk has a feature I'm looking forward to. Thanks.</p><p>该提问来源于开源项目:EsotericSoftware/kryo</p></div>
  • kryo-demo,kryo4.0.0-demo

    2017-07-25 11:31:27
    kryo4.0.0序列化反序列化demo
  • Updating Kryo

    2021-01-09 07:07:04
    <div><p>Updating Kryo to a newer version. Currently 5.0.0-RC9 is the most recent release. It includes the necessary updates that I asked for. It should be production ready. RC9 will most likely be the...
  • <div><p>It could be very useful if one could serialize instances of Kryo and serializers. This would essentially provide a meta-information about Kryo's configuration. And this can be used to ...
  • Kryo memoizer

    2020-12-08 20:08:43
    delegate using http://kryo.googlecode.com.</p> <p>Typical usage is to add <code>Memoizer</code> as one of the outermost <code>ReaderWrappers</code>: <pre><code> Memoizer m = new Memoizer(new ...
  • akka-kryo-serialization, 基于Kryo的Akka序列化 akka-kryo-serialization-- Scala 和Akka基于kryo的序列化程序这个库为 Scala 和Akka提供定制的基于kryo的序列化程序。 它可以用于更高效的akka远程处理。它还可以...
  • akka-kryo-serialization:针对Akka的基于Kryo的序列化
  • Extract Kryo interface

    2021-01-12 07:07:39
    <div><p>I have a number of extensions of Kryo in my code base, either to fix bugs or add checks. Right now I have to override a number of methods and it feels brittle. If you had a Kryo interface I ...
  • kryo浅析

    2019-04-28 18:58:17
    kryo浅析 简介 Kryo is a fast and efficient object graph serialization framework for Java. The goals of the project are speed, efficiency, and an easy to use API. The project is useful any time objects...

    kryo浅析

    简介

    Kryo is a fast and efficient object graph serialization framework for Java. The goals of the project are speed, efficiency, and an easy to use API. The project is useful any time objects need to be persisted, whether to a file, database, or over the network.
    https://github.com/EsotericSoftware/kryo

    总结点

    1. 其使用了字节码生成机制(底层依赖了 ASM 库)
    2. 必须包含无参构造器
    3. 不需要实现Serializable接口
    4. Kryo是线程不安全的,意味着每当需要序列化和反序列化时都需要实例化一次,或者借助ThreadLocal来维护以保证其线程安全。
    5. 使用 transient 关键字标记的字段不参与序列化

    简单实践

    maven依赖

            <dependency>
                <groupId>com.esotericsoftware</groupId>
                <artifactId>kryo</artifactId>
                <!--<artifactId>kryo-shaded</artifactId>-->
                <version>4.0.2</version>
            </dependency>
    
    @Data
    public class User2 {
    
        private Long id;
        private String name;
        private Date date;
        private transient String str;
    }
    
    package morning.cat.study.kryo;
    
    import com.esotericsoftware.kryo.Kryo;
    import com.esotericsoftware.kryo.io.Input;
    import com.esotericsoftware.kryo.io.Output;
    import com.esotericsoftware.kryo.pool.KryoPool;
    import org.junit.Test;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Calendar;
    import java.util.concurrent.ArrayBlockingQueue;
    
    public class KryoSerializableTest {
    
        @Test
        public void test() throws IOException {
            // 序列化
            Kryo kryo = new Kryo();
            Output output = new Output(new FileOutputStream("kryo.bin"));
            kryo.writeObject(output, getUser());
            output.close();
        }
    
        @Test
        public void test2() throws IOException {
            // 反序列化
            Kryo kryo = new Kryo();
            Input input = new Input(new FileInputStream("kryo.bin"));
            User2 user = kryo.readObject(input, User2.class);
            System.out.println(user);
        }
    
        private User2 getUser() {
            User2 user = new User2();
            user.setId(System.currentTimeMillis());
            user.setName("Kryo_" + System.currentTimeMillis());
            user.setDate(Calendar.getInstance().getTime());
            user.setStr("transient 关键字标记 不参与序列化");
            System.out.println(user);
            return user;
        }
    
        private static final ThreadLocal<Kryo> kryos =
                new ThreadLocal<Kryo>() {
                    @Override
                    protected Kryo initialValue() {
                        Kryo kryo = new Kryo();
                        return kryo;
                    }
                };
    
        @Test
        public void test3() throws FileNotFoundException {
    
            String fileName = "kryo_test3_3.bin";
    
            // ThreadLocal 方式
            Kryo kryo = kryos.get();
            kryo.setRegistrationRequired(false);//关闭注册行为
            kryo.setReferences(true);//支持循环引用
            Output output = new Output(new FileOutputStream(fileName));
            kryo.writeClassAndObject(output, getUser());
            output.close();
    
            Input input = new Input(new FileInputStream(fileName));
            Object object = kryo.readClassAndObject(input);
            if (object instanceof User2) {
                User2 user = (User2) object;
                System.out.println(user);
            }
        }
    
    
        @Test
        public void test4() {
            // 池技术
            KryoPool kryoPool = new KryoPool.Builder(() -> new Kryo()).queue(new ArrayBlockingQueue<>(20)).build();
            Kryo kryo = kryoPool.borrow();
    
    
            kryoPool.release(kryo);
        }
    
    
    }
    
    

    附录

    参考文档:
    http://www.iocoder.cn/RPC/laoxu/rpc-serialize-1/?geekbook

    https://github.com/EsotericSoftware/kryo

    展开全文
  • 简化的akka​​-kryo-serialization - 简化版本的akka​​-kryo-serialization akka-kryo-serialization是一个优秀的库,它为 Scala 和 Akka 提供基于 Kryo 的自定义序列化程序。 ( ) 但是,当我们使用它时,我们...
  • Add Kryo Serializer

    2020-12-02 02:08:09
    <div><p>This PR adds the Kryo Serializer. <p>https://github.com/EsotericSoftware/kryo</p>该提问来源于开源项目:AxonFramework/AxonFramework</p></div>
  • <div><p>The class resolver (inherits from com.esotericsoftware.kryo.util.DefaultClassResolver) needs to be unique for each kryo and cannot be shared among all new kryos created from the kryo factory....
  • Kryo Macros Scala com.esotericsoftware.kryo.Serializer于编译时反映在编译时生成com.esotericsoftware.kryo.Serializer实现。 特点和局限性 在顶层,仅支持案例类 案例类的字段可以是其他案例类,Scala集合,...
  • 公司用Kryo,先接触下,简单记录下。 引入包 <dependencies> <dependency> <groupId>com.esotericsoftware</groupId> <artifactId>kryo</artifactId> ...
  • 高通Kryo 架构

    2021-03-16 11:43:34
    高通Kryo架构 Kryo Kryo是Qualcomm Technologies推出的首款定制设计的64位CPU。 Kryo采用最新14纳米FinFET工艺制程,拥有四个核心,单核支持最高达2.2GHz的处理速度, 与骁龙810处理器相比,Kryo CPU在性能方面将...
  • Kryo 2 Upgrade

    2020-12-25 17:41:12
    <p>I submitted a pull req some time ago to upgrade these serializers for Kryo 2. Is this project still active? I'd like to contribute more, but I don't see much movement. <p>It'd be great ...
  • kryo-pool-example-源码

    2021-05-14 18:26:57
    kryo-pool-example 由于Kryo实例不是线程安全的,因此在多线程环境中,应使用kryo池( )。 此示例显示kryo池的用法以及如何在多线程环境中的Redis中序列化/反序列化Java对象。 Kryo池上下文 要获得具有班级注册的...
  • most recent failure: Lost task 16.9 in stage 9.0 (TID 28614, hdn10.mycorptcorporation.local): com.esotericsoftware.kryo.KryoException: java.lang.IndexOutOfBoundsException: Index: 100, Size: 6 ...
  • kryo4.0.0依赖包

    2017-11-27 14:06:34
    网络上大多数kryo4.0.0依赖包不能够正确反序列化自义定对象,部分依赖包不正确,本kryo4.0.0依赖包经过本人亲自验证,可以正确序列化与反序列化
  • <p>I saw in the Kryo code, that such serializer shoud be added by default if Java8 is enable. This is my case <pre><code> compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 ...
  • <p>I am trying to use KRYO to serialize my cache keys and values which are plain JAVA domain objects .Before I cache these objects and store in a hazelcast cache I serialize the objects via KRYO and ...
  • Kryo ClassNotFound in Hive UDF <p><strong>Component where the bug happens - [ ] Core analyzer - [x] UDF : Hive - [ ] Other <p><strong>Environment hive-2.1.1-cdh6.3.1 with hadoop-3.0.0-cdh6.3.1 <p>...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,187
精华内容 874
关键字:

kryo