关于 socket 序列化的疑惑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
PeanutMi
V2EX    Java

关于 socket 序列化的疑惑

  •  
  •   PeanutMi 2023-11-19 20:59:56 +08:00 1829 次点击
    这是一个创建于 690 天前的主题,其中的信息可能已经有所发展或是发生改变。

    某天老师布置的实验需要用到 socket 编程,在网上看到可以序列化对象,于是尝试的的去使用。 现在有个问题,我传入的对象是 User 对象如下:

    public class User implements Serializable { @Serial private static final long serialVersiOnUID= 6L; //其他成员变量 } 

    服务端的包为 Server ,客户端的包为 Client 。两者都有 pojo.User ,User 类的结构一致。 在服务端中用 Object inputObject = inputStream.readObject()读取:

    Socket clientSocket = serverSocket.accept(); ObjectInputStream inputStream = new ObjectInputStream(clientSocket.getInputStream()); Object inputObject = inputStream.readObject(); System.out.println(inputObject); if (inputObject instanceof User) { User receivedUser = (User) inputObject; System.out.println(receivedUser); } 

    但问题来了,无论如何程序无法进入 if 语句内,inputObject instanceof User 返回的结果都为 false ,在 idea 中调试发现 inputObject.getClass().getName()读取的结果确实是 User ,但 instanceof 返回的结果是 false 。 进一步调试发现当我采用 Server.pojo.User 创建对象时,Server 中的 inputObject instanceof User 就能正确返回 true 了,但采用 Client.pojo.User 创建时,就返回了 false 。

    为了方便各位 V 友看,情况是这样:

    • Server.pojo.User:inputObject.getClass().getName()为 User ,inputObject instanceof User 为 true
    • Client.pojo.User:inputObject.getClass().getName()为 User ,inputObject instanceof User 为 false

    万能的 V 友们,这个是怎么回事/(ㄒoㄒ)/~~

    10 条回复    2023-11-20 10:00:05 +08:00
    nulIptr
        1
    nulIptr  
       2023-11-19 21:23:42 +08:00
    Server.pojo.User 和 Client.pojo.User 当然不是一个类型啊,名字都不一样,你这只是两个类型离字段是相同的,不要用编程语言提供的序列化功能,可以发 json 或者 msgpack 等等的东西,只要字段一样就能反序列化
    pocketz
        2
    pocketz  
       2023-11-19 21:24:07 +08:00
    你已经把答案说出来了。。。
    liangkang1436
        3
    liangkang1436  
       2023-11-19 21:26:47 +08:00 via Android
    一般会把 user 类放到一个 public 包里面,然后客户端和服务端都依赖这个包
    pocketz
        4
    pocketz  
       2023-11-19 21:28:35 +08:00
    你再确认一下 getClass().getName() 是不是只返回了 User ,理论上包名也是返回值一部分
    PeanutMi
        5
    PeanutMi  
    OP
       2023-11-19 21:30:24 +08:00
    有报名我发帖的时候忽略了()
    PeanutMi
        6
    PeanutMi  
    OP
       2023-11-19 21:31:15 +08:00
    @liangkang1436 但这样不符合 client 和 server 的关系好像
    PeanutMi
        7
    PeanutMi  
    OP
       2023-11-19 21:33:07 +08:00
    @nulIptr 搜嘎
    cpstar
        8
    cpstar  
       2023-11-19 21:41:06 +08:00
    6# 啥叫不符合 S 和 C 的关系,S 和 C 用的都是同样一个 User ,放在两个 package 里边才叫不符合关系,S 和 C 只是位置概念,并不是 entity 关系概念。或者你换个想法,世界上本没有 S 或者 C ,都是干活,所谓的 C 干收集的活,所谓的 S 干处理的活,收集和处理都是同样一个东西,你说该不该是同样一个 User ?

    从语言层面,instanceof User 到底是 server.User 还是 client.User ,看你 import 的是什么,server.User 和 client.User 是完全两个类。序列化除了序列化类的数据内容,还有很多类加载的相关信息,把 server.User 序列化再反序列化,还是 server.User ,当然不是 client.User 的 instance 。所以 2#说的一点都没错,你自己就把答案说出来了。
    PeanutMi
        9
    PeanutMi  
    OP
       2023-11-19 21:55:18 +08:00
    @cpstar 受教了
    orangie
        10
    orangie  
       2023-11-20 10:00:05 +08:00
    java 一个类的完整名称其实是包+类名,应该用 getCanonicalName()获得这个标准名称而不是 getName()。更深入一点还涉及每个类的类加载器也限定了这个类。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3608 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 00:48 PVG 08:48 LAX 17:48 JFK 20:48
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86