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

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

  •  
  •   wsseo · Mar 18, 2025 · 3070 views
    This topic created in 597 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
    DefoliationM
    Mar 18, 2025 via Android
    1
    ts 就这样吧,感觉还好。go 的那个也挺麻烦的。
    irrigate2554
    irrigate2554
    Mar 18, 2025
    2
    和 dart 很像
    flyqie
    flyqie
    Mar 18, 2025 via Android
    3
    啥业务非得用这个语言啊...

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