首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

绑定子类的泛型基类,反模式?

这次总结一个个人认为的反模式:“绑定子类的泛型层基类”,这个模式在一些著名的框架中也见到过,如果CSLA、BlogEngine。我自己在原来的写的框架中,也用到过。    ...当然了,个人认为是反模式,各们同仁并不一定这样认为,仁者见仁,智者见智了。不过我好几次都是受尽折磨,所以决定写出来给大家分享下心得。...基于这个基类的代码重用,使得子类的代码非常简单。这里和普通继承、普通泛型的不同点在于父类在运行时绑定了具体子类的类型。 设计原理     为什么要这样设计?基类为什么不直接使用非泛型的基类呢?...同样的功能,如果你要使用非泛型的基类,由于所有类型共享一个运行时基类,你需要考虑为在基类中为每个具体的类型存储对应的值,例如,使用一个字典存储: public abstract class EntityBase...要解决这个问题,我们需要把需要进行再继承的类也提取为一个泛型基类和一个继承此基类的空的子类。

1K50

还在被数据类的序列化折磨?是时候丢弃 Gson 了

它作为一套专门为 Kotlin 的类开发的序列化框架,自然要兼顾到 Kotlin 的类型的各种特性,你会发现用 Gson 来序列化 Kotlin 类时遇到的奇怪的问题在这里都没了。...")) //加载自定义的 Serializer 有些情况下需要反射 compile(kotlin("reflect", "1.2.60")) //序列化框架的重要部分:运行时库...所以我要给 Date 自定义一个序列化的格式,怎么办?...通常如果作为一个类的成员,我们可以通过注解 @Serializable(with=MyDateSerializer::class) 来指定序列化工具类,就像我们前面为 Date 指定序列化工具类一样:...不同的是,我们这回用 Gson 去反序列化同样的字符串,结果呢? ? 为什么会这样?

2.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Gson 系列文章

    添加 @Expose 注解是一个非常简单的控制哪些要被(反)序列化的方式。我们建议如果需要所有的都被转化,就不用添加 @Expose 注解了,不然只会搞乱你的模型类。...Gson Advanced — 简单自定义序列化 本文将实现一个自定义的 Gson serialization 过程,有些情况我们可能会考虑到自定义,例如:和 server 通信时,有时候不需要传递一个完成...简化自定义序列化为单个对象 通过 @Expose 是能解决一部分问题,但是存在局限性,现在我们使用自定义来解决这些问题,作法不干涉 Merchant 类,只在干涉序列化过程。...Gson 的自定义序列化,但具体逻辑部分需要我们自己实现。...Advanced — 通过 @JsonAdapter 自定义(反)序列化 之前我们介绍了如何使用 Gson 来自定义(反)序列化和自定义实例创建。

    15.6K10

    Spring Boot 之使用 Json 详解

    当 Jackson 在类路径上时,会自动配置 ObjectMapper bean。 Spring Boot 提供了 Gson 的自动配置。...指定类的 Json 序列化、反序列化 如果使用 Jackson 序列化和反序列化 JSON 数据,您可能需要编写自己的 JsonSerializer 和 JsonDeserializer 类。...自定义序列化程序通常通过模块向 Jackson 注册,但 Spring Boot 提供了另一种 @JsonComponent 注释,可以更容易地直接注册 Spring Beans。...您还可以在包含序列化程序/反序列化程序作为内部类的类上使用它,如以下示例所示: import java.io.*; import com.fasterxml.jackson.core.*; import...Spring Boot 还提供了 JsonObjectSerializer 和 JsonObjectDeserializer 基类,它们在序列化对象时提供了标准 Jackson 版本的有用替代方法。

    4.1K10

    Gson的学习与使用

    Gson介绍: GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。...//上面的注解是lombok的注解,起到简化Bean类的作用。 Gson提供了public String toJson(Objcet obj)方法,可以将对象转化为json字符串。...}.getType()); System.out.println("---->listJsonStr convert List " + list); } } 结果: json的抽象基类...4)@Expose(deserialize = false, serialize = true)既可以序列化,也可以反序列化。 注:这里的序列化指:将对象转化为json字符串。..." +e); } } } 结果: 3)使用注解jsonAdapter,其实质也是自定义Adapter   该方法更倾向于某一个属性的保护。

    1.5K20

    穿越到东汉末年的Jackson

    Gson: 吾观取汉上之地,易如反掌。我主刘豫州躬行仁义,不忍夺同宗之基业,故力辞之。刘琮孺子,听信佞言,暗自投降,致使曹操得以猖獗。...android虚拟机:反射的方式 gson:反射+反射缓存、支持部分stream、内存性能较差(gc问题) ASM ASM是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。...让我们为MyBean实体的属性设置自定义顺序: 这是序列化的输出: image.png @JsonRootName 该 @JsonRootName注释时,如果包裹被启用,以指定的包装中使用的根目录的名称...包装意味着不是将User序列化为以下内容: 它将像这样包装: image.png image.png @JsonSerialize @JsonSerialize表示在编组实体 时要使用的自定义序列化程序...我们将使用 @JsonSerialize通过CustomDateSerializer序列化eventDate属性: image.png 这是简单的自定义 Jackson 序列化程序: image.png

    2K20

    使用Serializable接口来自定义PHP中类的序列化

    使用Serializable接口来自定义PHP中类的序列化 关于PHP中的对象序列化这件事儿,之前我们在很早前的文章中已经提到过 __sleep() 和 __weakup() 这两个魔术方法。...: "A:",很明显对应的是类名,也就是类的::class "{xxx}",对象结构和JSON一样,也是用的花括号 各种类型的数据进行序列化的结果 下面我们再来看下不同类型序列化的结果。...这样看来,我们的反序列化还是非常智能的,有一点点的不同都无法进行还原操作。 未定义类的反序列化操作 最后,我们来看看未定义类的情况下,直接反序列化一个对象。...划重点哦,如果是C:开头的序列化字符串,一定需要是定义过的且实现了 Serializable 接口的类 才能反序列化成功。...另外,我们可以发现,当序列化字符串中的模板不存在时,反序列化出来的类的类名是 __PHP_Incomplete_Class_Name 类,不像有类模板的反序列化成功直接就是正常的类名。

    1.5K20

    Google Gson用法详解

    所有这些更改都可以使用@Since注释进行标记,以跟踪模型类,在这些系统使用反序列化JSON数据进行交换时,与其他系统的应用程序交互不会中断。...允许我们从Java类中排除或忽略不希望包含在序列化和反序列化中的字段。...但是,如果打算自定义Gson的行为,则可以使用GsonBuilder自定义的配置来创建新的Gson实例。 GsonBuilder类提供一个.create()方法,该方法返回一个Gson实例。...语法规则 在反序列化期间,Gson使用了一个宽松的JsonReader类。...1.2、自定义序列化示例 假设我们遇到一种情况,我们必须将Java对象序列化为json,这样所有布尔值都应写为1或0,而不是打印true或false。 让我们为该要求编写自定义序列化程序。

    22.1K31

    【C++】异常处理 ⑧ ( 标准异常类 | 标准异常类继承结构 | 常用的标准异常类 | 自定义异常类继承 std::exception 基类 )

    中 , 抛出的异常 , 都是 标准异常类 , 都是 std::exception 类的子类 ; 2、标准异常类继承结构 标准异常类 定义在 std 命名空间 , 标准异常类 基类 std::exception... 3、常用的标准异常类 常用的标准异常类如下 : std::exception 是标准异常类 基类 , 定义了 what() 函数 , 该方法返回一个指向 C 字符串的指针 ,..., 会抛出此异常 ; 二、自定义异常类继承 std::exception 基类 1、自定义异常类继承 std::exception 基类 首先 , 导入 头文件 ; #include... 然后 , 自定义类继承 std::exception 类 , 通过构造函数设置异常信息 , 重写 what 函数 , 在该函数中返回异常信息 ; // 自定义类实现标准异常类基类...::exception 基类 代码示例 : #include #include using namespace std; // 自定义类实现标准异常类基类

    65110

    一种自动的将自定义类序列化为JSON的方法

    最近因为项目需求,需要将一些自定义的类序列化为JSON,网上有很多好用的第三方序列化工具,但都只能自动序列化一些基本类型,如NSNumber,NSString与NSDictionary这种,没有一种第三方工具提供直接将自定义类序列化的方法...(至少据我所知:),而对于这种序列化自定义的类的需求,网上能查到的方法只有将自定义的类手动的转存为一个NSDictionary,然后再使用第三方工具来序列化。...因为在JAVA中有工具通过反射机制可以实现自动的序列化自定义类,于是抱着试一试的心态,开始寻找Objective-C中对应的方法。...iOS的Runtime Programming中提供了一系列强大的方法在运行时对类进行操作,比如获取类的属性信息,类的协议信息,甚至是修改,增加,删除类的方法。...实际上我们需要解决的问题,就是动态的获取一个类中所有的属性名,只要能够获取这个,再通过这些属性名找到对应的属性值,最终把这些名-值建立成对,放入一个NSDictionary中,就可以使用第三方工具完成序列化的工作了

    1.1K70

    Android 代码混淆

    -keepclasseswithmembers 防止拥有该成员的类和成员被移除或者被重命名 -keepclasseswithmembernames 防止拥有该成员的类和成员被重命名 类通配符 * 匹配任意长度字符...类extends 即可以指定类的基类 类implements 匹配实现了某接口的类 类$ 内部类 成员(方法)通配符 * 匹配任意长度字符,但不含包名分隔符(.)...) # ############################################# # 保留我们使用的四大组件,自定义的Application等等这些类不被混淆 # 因为这些子类都有可能被外部调用...android.util.AttributeSet); public (android.content.Context, android.util.AttributeSet, int); } # 保留Parcelable序列化类不被混淆...android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留Serializable序列化的类不被混淆

    1.3K30

    除了FastJson,你还有选择: Gson简易指南

    JosnObject 生成 JSON 除了上述将自定义类的对象转换成 JSON 的方式之外,还可以使用 Gson 框架提供的 JsonObject 构建普通对象,然后使用 toJson 方法生成 JSON...自定义序列化 如果我们要对Java 对象的某些字段进行特殊处理,比如隐藏某些字段的序列化,对字段的数据格式化处理等,我们可以通过实现 JsonSerializer 接口,对序列化逻辑进行自定义。...与自定义序列化实现方式类似,想要自定义反序列化逻辑,就需要同样要实现一个叫 JsonDeserializer 的接口,进行自定义反序列化逻辑的实现。...@Since 该注解用于标记对应字段或者类型的版本,让 Gson 可以指定版本号进行序列化和反序列化操作。当Web服务上的 JSON 数据对应的实体类存在多个版本的字段时,这个注解就十分有用。...方法执行简化成了注解方法,这里就不再演示,直接在前文自定义反序列化一节的 Result 类上使用就可以看到效果。

    1.3K30

    Android 序列化框架 Gson 原理分析,可以优化吗?

    配置项 Gson 类是整个库的核心 API,在进行任何序列化或反序列化之前,我们都需要获得一个 Gson 对象。...; @Until 注解: 声明在具体类或字段上,声明字段的终止序列化版本。...基本类型 JsonNull null 值 1.4 TypeAdapter 自定义解析 TypeAdapter 是 Gson 2.0 新增的自定义解析 API,是基于流式结构的 API。...由于 Java 有泛型擦除,无法直接在 .class 语法上声明泛型信息,Gson 的方法是要求程序员创建匿名内部类,由 Gson 在运行时通过反射获取类声明上的泛型信息。...[3] —— Norman Peitek 著 Javadoc · Gson[4] —— Gson 官方文档 Gson 源码解析和它的设计模式[5] —— 拉丁吴 著 还在被数据类的序列化折磨?

    2.4K50

    除了FastJson,你还有选择: Gson简易指南

    JosnObject 生成 JSON 除了上述将自定义类的对象转换成 JSON 的方式之外,还可以使用 Gson 框架提供的 JsonObject 构建普通对象,然后使用 toJson 方法生成 JSON...自定义序列化 如果我们要对Java 对象的某些字段进行特殊处理,比如隐藏某些字段的序列化,对字段的数据格式化处理等,我们可以通过实现 JsonSerializer 接口,对序列化逻辑进行自定义。...与自定义序列化实现方式类似,想要自定义反序列化逻辑,就需要同样要实现一个叫 JsonDeserializer 的接口,进行自定义反序列化逻辑的实现。...@Since 该注解用于标记对应字段或者类型的版本,让 Gson 可以指定版本号进行序列化和反序列化操作。当Web服务上的 JSON 数据对应的类存在多个版本的字段时,这个注解就十分有用。...方法执行简化成了注解方法,这里就不再演示,直接在前文自定义反序列化一节的 Result 类上使用就可以看到效果。

    1.6K40

    采用Gson解析含有多种JsonObject的复杂json

    当序列化或者反序列化目标类的时候就会调用我们注册的typeAdapter, 这样就实现了人工干预 Gson 的序列化和反序列化过程。...当反序列化到对应的类的时候就会调用这个自定义 JsonDeserializer 的 deserialize() 方法。下面对这个方法的几个参数做一下解释,以便于更好的理解Gson解析的过程。 ?...JsonDeserializationContext 这个类是在反序列过程中,由其它类调用我们自定义的 JsonDeserialization 的 deserialize() 方法时传递过来的,在 Gson...如何把 json 准确的转为对应的 JavaBean 我们注册的是父类 Attribute ,当反序列化需要解析 Attribute 的时候就会把对应的 json 作为参数回调自定义的 JsonDeserializer...在Android中我们反序列这样的 json 后一般会把得到的对象的设置到列表控件上,如果后端返回的 json 中包含之前未注册的类型,为了程序不至于 crash,需要对反序列化的 null 对象进行过滤

    2.4K20

    SpringBoot的序列化和反序列化

    (1)我们创建的Java对象被存储在Java堆中,当程序运行结束后,这些对象会被JVM回收。但在现实的应用中,可能会要求在程序运行结束之后还能读取这些对象,并在以后检索数据,这时就需要用到序列化。...4、serialVersionUID 的作用 虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致,这个所谓的序列化ID,就是我们在代码中定义的...此时需要自定义自己的消息转换器,有两种方式 方式一 使用Spring或者第三方提供的HttpMessageConverter(如FastJson,Gson,Jackson) 问题引入字符类型字段为null...); System.out.println(numList.get(0)); } 这是因为在反序列化的过程中,Gson会根据待解析的类型定位到具体的TypeAdaptor类,并通过该类的...) { return lngNum; } else { return dbNum; } step2:修改Gson的适配器为自定义的 GsonBuilder gsonBuilder = new

    2.5K40

    字符串与Java对象的互转

    当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。...序列化操作的对象需要实现Serializable或Externalizable,并且其内部所有属性也必须是可序列化的(String和StringBuilder类已实现了Serializable,基本数据类型默认可序列化...一般都是把对象转为josn格式进行序列化 自定义类举例: import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor...) { }.getType()); } } 后记 使用FastJSON序列化时,栈内存溢出: 原因:需要被反序列化的实体类继承了一个类(DataEntity),该类中的一个递归方法陷入了死循环...,最终导致栈内存溢出 经过多方调试后发现,类()中的()方法的属性在递归中一直都是,最终导致栈内存溢出。

    79220
    领券