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

3 天前
wsseo  wsseo

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
}

1019 次点击
所在节点   程序员  程序员
11 条回复
DefoliationM
DefoliationM
3 天前
ts 就这样吧,感觉还好。go 的那个也挺麻烦的。
xausky
3 天前
和 dart 很像
flyqie
3 天前
啥业务非得用这个语言啊...

难道是国产化要求用了?
Tomatopotato
3 天前
我认为开发 cj 的那群人应该不会上这个论坛 (笑
InkStone
3 天前
看了下都是 trivial 的字段映射。定制比较多的序列化和反序列化也就算了,这种 trivial 的就不能直接自动生成么
wsseo
3 天前
@flyqie 我觉得学这个语言还是有前途的,就是难学。
wuxilaoshiren
2 天前
@wsseo 学了可以干嘛 专门干国产化的嘛
wsseo
2 天前
@wuxilaoshiren 可以做后端开发,也可以鸿蒙 APP 开发
csfreshman
2 天前
还真有人学这个呀,这个赛道你们卷去吧,哈哈哈
sthwrong
2 天前
看起来就是要自己实现序列化反序列化接口,第三方做个序列化库,用注解生成序列化接口的实现也许可以。
ns09005264
2 天前
这个写法就像是仓颉没有注解和反射功能。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1119336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX