V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wsseo
V2EX  ›  程序员

仓颉编程语言的这个反序列化和序列化比 go 复杂好多

  •  
  •   wsseo · 1 天前 · 875 次点击

    golang 用 Unmarshal 和 marshal 函数就行了。

    仓颉要写这个一大堆,有人反馈这个写法跟 C++有的一拼,但是性能不如 java,go ,c++。

    希望官方能优化一下,对初学者友好。

    下面是官网的例子。

    import serialization.serialization.*
    import encoding.json.*
    
    class Person <: Serializable<Person> {
        var name: String = ""
        var age: Int64 = 0
        var loc: Option<Location> = Option<Location>.None
    
        public func serialize(): DataModel {
            return DataModelStruct().add(field<String>("name", name)).add(field<Int64>("age", age)).add(field<Option<Location>>("loc", loc))
        }
    
        public static func deserialize(dm: DataModel): Person {
            var dms = match (dm) {
                case data: DataModelStruct => data
                case _ => throw Exception("this data is not DataModelStruct")
            }
            var result = Person()
            result.name = String.deserialize(dms.get("name"))
            result.age = Int64.deserialize(dms.get("age"))
            result.loc = Option<Location>.deserialize(dms.get("loc"))
            return result
        }
    }
    
    class Location <: Serializable<Location>{
        var country: String = ""
        var province: String = ""
    
        public func serialize(): DataModel {
            return DataModelStruct().add(field<String>("country", country)).add(field<String>("province", province))
        }
    
        public static func deserialize(dm: DataModel): Location {
            var dms = match (dm) {
                case data: DataModelStruct => data
                case _ => throw Exception("this data is not DataModelStruct")
            }
            var result = Location()
            result.country = String.deserialize(dms.get("country"))
            result.province = String.deserialize(dms.get("province"))
            return result
        }
    }
    
    main() {
        var js = ##"{
        "name": "A",
        "age": 30,
        "loc": {
            "country": "China",
            "province": "Beijing"
        }
    }"##
        var jv = JsonValue.fromStr(js)
        var dm = DataModel.fromJson(jv)
        var A = Person.deserialize(dm)
        println("name == ${A.name}")
        println("age == ${A.age}")
        println("country == ${A.loc.getOrThrow().country}")
        println("province == ${A.loc.getOrThrow().province}")
        println("====================") // 上部分实现从 JSON 字符串到自定义类型的转换,下部分实现从自定义类型到 JSON 字符串的转换。
        dm = A.serialize()
        var jo = dm.toJson().asObject()
        println(jo.toJsonString())
        0
    }
    
    
    11 条回复    2025-03-19 15:08:32 +08:00
    DefoliationM
        1
    DefoliationM  
       23 小时 38 分钟前 via Android
    ts 就这样吧,感觉还好。go 的那个也挺麻烦的。
    xausky
        2
    xausky  
       22 小时 47 分钟前
    和 dart 很像
    flyqie
        3
    flyqie  
       20 小时 17 分钟前 via Android
    啥业务非得用这个语言啊...

    难道是国产化要求用了?
    Tomatopotato
        4
    Tomatopotato  
       8 小时 32 分钟前
    我认为开发 cj 的那群人应该不会上这个论坛 (笑
    InkStone
        5
    InkStone  
       8 小时 24 分钟前
    看了下都是 trivial 的字段映射。定制比较多的序列化和反序列化也就算了,这种 trivial 的就不能直接自动生成么
    wsseo
        6
    wsseo  
    OP
       8 小时 19 分钟前
    @flyqie 我觉得学这个语言还是有前途的,就是难学。
    wuxilaoshiren
        7
    wuxilaoshiren  
       6 小时 18 分钟前
    @wsseo 学了可以干嘛 专门干国产化的嘛
    wsseo
        8
    wsseo  
    OP
       5 小时 42 分钟前
    @wuxilaoshiren 可以做后端开发,也可以鸿蒙 APP 开发
    csfreshman
        9
    csfreshman  
       3 小时 24 分钟前
    还真有人学这个呀,这个赛道你们卷去吧,哈哈哈
    sthwrong
        10
    sthwrong  
       3 小时 23 分钟前
    看起来就是要自己实现序列化反序列化接口,第三方做个序列化库,用注解生成序列化接口的实现也许可以。
    ns09005264
        11
    ns09005264  
       2 小时 51 分钟前
    这个写法就像是仓颉没有注解和反射功能。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4654 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 10:00 · PVG 18:00 · LAX 03:00 · JFK 06:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.