精华内容
下载资源
问答
  • 1. transient关键字的用途...在反序列化过程中,transient关键字修饰的成员变量默认赋值该成员变量类型的默认值,例如int型为0,boolean为false,对象类型为null。 3. transient默认处理方式引发的问题 反序列化过程中

    1. transient关键字的用途

    用于在实现Serializable接口的类中标记成员变量,使该类对象在序列化和反序列化过程中忽略该成员变量的处理。

    2. transient序列化和反序列化过程中的处理方式

    1. 在序列化过程中,transient关键字修饰的成员变量默认处理方式使直接忽略
    2. 在反序列化过程中,transient关键字修饰的成员变量默认赋值该成员变量类型的默认值,例如int型为0,boolean为false,对象类型为null。

    3. transient默认处理方式引发的问题

    反序列化过程中,transient修饰的成员变量赋值可能不是期望的默认值,例如:

    import java.io.*;
    public class JavaSerializableObj {
        
        public static void main(String[] args) {
            Obj obj = new Obj();
            System.out.println("Obj.member = " + obj.getMember() + "; Obj.ignore = " + obj.getIgnore());
            try {
                FileOutputStream fos = new FileOutputStream("obj");
                ObjectOutputStream oos = new ObjectOutputStream(fos);
                oos.writeObject(obj);
                oos.close();
                System.out.println("write obj to file success");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            try {
                FileInputStream fis = new FileInputStream("obj");
                ObjectInputStream ois = new ObjectInputStream(fis);
                obj = (Obj) ois.readObject();
                ois.close();
                System.out.println("read obj from file success");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            System.out.println("Obj.member = " + obj.getMember() + "; Obj.ignore = " + obj.getIgnore());
        }
        public static class Obj implements Serializable {
            private final String member = "Member";
            private final transient String ignore = new String("Ignore");
            public String getMember() {
                return member;
            }
            public String getIgnore() {
                return ignore;
            }
        }
    }
    

    以上输出的结果为:

    Obj.member = Member; Obj.ignore = Ignore
    write obj to file success
    read obj from file success
    Obj.member = Member; Obj.ignore = null
    

    Obj类中transient修饰的成员变量ignore为final类型,并且默认值为new String(“Ignore”),但反序列化后缺为null,因为在反序列化过程中对象类型的值默认处理为null,这可能就不是业务逻辑所期望的。
    注意:如果这里ignore的初始值改为ignore = “ignore”(非new出来的对象),反序列化却可以正常恢复ignore默认值,原因是final String字符串对象以字符串字面量赋值,java编译器编译的时候其实把该对象编译优化为常量,反序列化自然就没有问题了。

    4. 自定义序列化和反序列化过程

    为了解决transient关键字在序列化和反序列化过程中带来的问题,对有特殊业务要求的场景可以通过自定义序列化和反序列化过程来解决这些问题。
    Serializable接口提供了三个自定义序列化过程的方法:

    /**
    * 处理对象序列化过程,默认应该调用out.defaultWriteObject()方法序列化
    * 非static和transient修饰的成员变量
    */
    private void writeObject(java.io.ObjectOutputStream out)
           throws IOException
    /**
    * 处理对象反序列化过程,默认应该调用in.defaultReadObject()方法反序列化
    * 非station和transient修饰的成员变量
    */
    private void readObject(java.io.ObjectInputStream in)
           throws IOException, ClassNotFoundException;
    /**
    * 用于反序列化过程中识别到未定义成员变量时的回调处理,常见于同个类在反序列化时修改了继承关系,
    * 或远程传输过来的序列化数据版本与当前类的序列化版本不一致。
    */
    private void readObjectNoData()
           throws ObjectStreamException;
    

    针对上面的问题可以将Obj类处理为:

        public static class Obj implements Serializable {
            private final String member = "Member";
            private final transient String ignore = new String("Ignore");
            public String getMember() {
                return member;
            }
            public String getIgnore() {
                return ignore;
            }
            
            private void readObject(java.io.ObjectInputStream in)
                    throws IOException, ClassNotFoundException{
                in.defaultReadObject();
                //final变量需要通过反射来赋值
                try {
                    Field ignoreField = getClass().getDeclaredField("ignore");
                    ignoreField.setAccessible(true);
                    ignoreField.set(this, new String("Read Ignore"));
                    ignoreField.setAccessible(false);
                } catch (NoSuchFieldException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    

    输出结果为:

    Obj.member = Member; Obj.ignore = Ignore
    write obj to file success
    read obj from file success
    Obj.member = Member; Obj.ignore = Read Ignore
    
    展开全文
  • 我正在尝试一个简单的JSON来反序列化到java对象.但是,我获取了java.lang.String属性值的空String值.在其余属性中,空值正在转换为空值(这就是我想要的).我的JSON和相关的Java类如下所示.JSON字符串:{"eventId" : 1,...

    我正在尝试一个简单的JSON来反序列化到java对象.但是,我获取了java.lang.String属性值的空String值.在其余属性中,空值正在转换为空值(这就是我想要的).

    我的JSON和相关的Java类如下所示.

    JSON字符串:

    {

    "eventId" : 1,

    "title" : "sample event",

    "location" : ""

    }

    EventBean类POJO:

    public class EventBean {

    public Long eventId;

    public String title;

    public String location;

    }

    我的主要类代码:

    ObjectMapper mapper = new ObjectMapper();

    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    try {

    File file = new File(JsonTest.class.getClassLoader().getResource("event.txt").getFile());

    JsonNode root = mapper.readTree(file);

    // find out the applicationId

    EventBean e = mapper.treeToValue(root, EventBean.class);

    System.out.println("It is " + e.location);

    }

    我期待打印“它是空的”.相反,我得到“它是”.显然,在转换为我的String对象类型时,Jackson不会将空字符串值视为NULL.

    我读到了预期的地方.但是,这也是我想要避免的java.lang.String.有一个简单的方法吗?

    解决方法:

    杰克逊会为其他对象提供null,但对于String,它将给出空字符串.

    但是您可以使用Custom JsonDeserializer来执行此操作:

    class CustomDeserializer extends JsonDeserializer {

    @Override

    public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {

    JsonNode node = jsonParser.readValueAsTree();

    if (node.asText().isEmpty()) {

    return null;

    }

    return node.toString();

    }

    }

    在课堂上,你必须将它用于位置字段:

    class EventBean {

    public Long eventId;

    public String title;

    @JsonDeserialize(using = CustomDeserializer.class)

    public String location;

    }

    标签:java,json,jackson

    来源: https://codeday.me/bug/20190927/1823519.html

    展开全文
  • 我正在尝试使用简单的JSON反序列化为Java对象。不过,我,让空 字符串值,java.lang.String属性值。在其余的属性中,空白值将转换为 空 值(这是我想要的)。我的JSON和相关的Java类在下面列出。JSON字串:{"eventId" ...

    我正在尝试使用简单的JSON反序列化为Java对象。不过,我,让空 字符串

    值,java.lang.String属性值。在其余的属性中,空白值将转换为 空 值(这是我想要的)。

    我的JSON和相关的Java类在下面列出。

    JSON字串:

    {

    "eventId" : 1,

    "title" : "sample event",

    "location" : ""

    }

    EventBean 类POJO:

    public class EventBean {

    public Long eventId;

    public String title;

    public String location;

    }

    我的主要课程代码:

    ObjectMapper mapper = new ObjectMapper();

    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

    try {

    File file = new File(JsonTest.class.getClassLoader().getResource("event.txt").getFile());

    JsonNode root = mapper.readTree(file);

    // find out the applicationId

    EventBean e = mapper.treeToValue(root, EventBean.class);

    System.out.println("It is " + e.location);

    }

    我期待打印“它为空”。相反,我得到“ It is”。显然, 杰克逊 在转换为我的 String 对象类型时并未将空白String值视为NULL 。

    我读到了预期的地方。但是,对于 java.lang.String 我也要避免这种情况。有没有简单的方法?

    展开全文
  • java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull 我已经将该字段设为可空,但是始终将其反序列化为null....

    我最近从Gson切换到Moshi,并且在解析某些Json时遇到了麻烦.

    {

    "access_token": "-LNe2LQ7DQH5Y2zs_W5iUumKuaUE",

    "token_type": "bearer",

    "device_id": "461f-837e-af5050c92fe9",

    "expires_in": 3600,

    "scope": "*"

    }

    这是模型类:

    data class AuthToken(

    @Json(name = "access_token") val accessToken: String,

    @Json(name = "token_type") val tokenType: String,

    @Json(name = "device_id") val deviceId: String,

    @Json(name = "expires_in") val expiresIn: Int,

    @Json(name = "scope") val scope: String

    )

    每当我在改造客户端中使用Moshi时,都会收到以下错误消息:

    java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull

    我已经将该字段设为可空,但是始终将其反序列化为null.我已经检查了改造响应,并且使用Gson或Moshi时(显??然)是相同的.我究竟做错了什么?

    展开全文
  • 我正在写一个SOAP Web服务的客户端....然后我使用一个MediaService.aegis.xml文件来提供方法参数的名称(对于它们不被命名和序列化请求).这是我在客户端上使用的代码:ClientProxyFactoryBean factory...
  • 我将Json null反序列化为Java Object空字符串我可以创建自定义反序列化器,但是当Json值为null时,它不会进入反序列化器.我该如何反序列化呢?提前致谢!public class CustomStringDeserializer extends ...
  • 一直使用jackson处理json,最近前端传来的数据如下{“funcCode”:”Read_...不然有可能写入数据库错误的空字符串数据或者非字符串类型的字段报错解决方案如下:先写一个自定义反序列化类package com.gpdi.radar.busin...
  • 对我有用的解决方案是创建一个自定义JSON反序列化器,将null转换为Double.NaN.调整我写的内容以匹配上面的示例代码,它看起来像这样.public class ThingDeserializer extends JsonDeserializer {@Overridepublic Thing...
  • 我可以使用自定义反序列化器轻松完成此操作,但我希望能够与该类一起完成此操作.例如,我从Elasticsearch返回以下JSON.{"_index": "twitter","_type": "tweet","_id": "AVodOsgk0etILSbJamY-","_score": null,"_source...
  • 我认为JSON字符串的格式不正确,无法对地图类型进行默认的GSON反序列化.我已修改输入字符串供您考虑,这将导致非null的LocalLocationId{"LocalLocationId":[["1",{"type":"folderlocation","id":{"type":...
  • 一、JSON简介  JSON(JavaScript Object Notation,...结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。  JSON具有以
  • public class XmlDataSerializer { public object GetObjectData(string stream,Type type) { if (string.IsNullOrEmpty(stream)) return null; stream = str...
  • <pre><code>$objectNormalizer = new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter(), null, new ReflectionExtractor()); $jsonEncoder = new JsonEncoder(); $serializer = new Serializer([$...
  • 一、JSON简介 JSON(JavaScript Object Notation,JavaScript对象...结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。 JSO...
  • 即无法反序列化(反序列失败),得到对象为null ,把 xml 文本 Trim一下。 xml=xml.Trim(); 序列化完毕你可以看到尾部有填充的 \0 。。。 要Trim掉。 参考:https://www.cnblogs.com/XChWaad/p/3346875.html 你可以...
  • fastJson反序列化为类对象时,反序列化赋值的属性只会是你构造器上写的属性。 所以部分属性值为null的原因是属性没有加在构造器上的原因。 直接加个无参数的默认构造器即可解决。或者把null属性加构造器上。 如下...
  • 1个文件的仅标头库,用于将C ++类型自动(序列化为JSON。 怎么运行的 该库为常见类型提供了一组预定义的()序列化器: std::nullptr_t bool 所有标准整数( std::int*_t , std::uint*_t )和浮点数( ...
  • 这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 示例: 你可以将以下二叉树: 序列化为 “[1,2,3,null,null,4,5]” 解题...
  • 这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 示例: 你可以将以下二叉树: 1 / 2 3 / 4 5 序列化为 “[1,2,3,...
  • 这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 示例:  你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,...
  • 您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。 样例 你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4 为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]" 注意: ...
  • 这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 示例: 你可以将以下二叉树: 序列化为 “[1,2,3,null,null,4,5]” 提示: ...
  • //序列化为后序遍历序列,同样也是有后序遍历序列反序列化为二叉搜索树 public StringBuilder postorder (TreeNode root, StringBuilder sb) { if(root == null) return sb; postorder(root.left, sb); ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 202
精华内容 80
关键字:

反序列化为null