• 请不要在回答技术问题时复制粘贴 AI 生成的内容
wsseo
V2EX  ›  程序员

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

  •  
  •   wsseo · Mar 18, 2025 · 2500 views
    This topic created in 447 days ago, the information mentioned may be changed or developed.

    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
    }
    
    
    12 replies    2025-05-23 09:37:20 +08:00
    DefoliationM
        1
    DefoliationM  
       Mar 18, 2025 via Android
    ts 就这样吧,感觉还好。go 的那个也挺麻烦的。
    irrigate2554
        2
    irrigate2554  
       Mar 18, 2025
    和 dart 很像
    flyqie
        3
    flyqie  
       Mar 18, 2025 via Android
    啥业务非得用这个语言啊...

    难道是国产化要求用了?
    Tomatopotato
        4
    Tomatopotato  
       Mar 19, 2025
    我认为开发 cj 的那群人应该不会上这个论坛 (笑
    InkStone
        5
    InkStone  
       Mar 19, 2025
    看了下都是 trivial 的字段映射。定制比较多的序列化和反序列化也就算了,这种 trivial 的就不能直接自动生成么
    wsseo
        6
    wsseo  
    OP
       Mar 19, 2025
    @flyqie 我觉得学这个语言还是有前途的,就是难学。
    wuxilaoshiren
        7
    wuxilaoshiren  
       Mar 19, 2025
    @wsseo 学了可以干嘛 专门干国产化的嘛
    wsseo
        8
    wsseo  
    OP
       Mar 19, 2025
    @wuxilaoshiren 可以做后端开发,也可以鸿蒙 APP 开发
    csfreshman
        9
    csfreshman  
       Mar 19, 2025
    还真有人学这个呀,这个赛道你们卷去吧,哈哈哈
    sthwrong
        10
    sthwrong  
       Mar 19, 2025
    看起来就是要自己实现序列化反序列化接口,第三方做个序列化库,用注解生成序列化接口的实现也许可以。
    Fatinora
        11
    Fatinora  
       Mar 19, 2025
    这个写法就像是仓颉没有注解和反射功能。
    Lockroach
        12
    Lockroach  
       May 23, 2025
    鸿蒙 app 现在主流是用 arkts 吧,感觉仓颉更像做嵌入式设备的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1263 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 17:26 · PVG 01:26 · LAX 10:26 · JFK 13:26
    ♥ Do have faith in what you're doing.