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

185 天前
 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
}

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

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

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

https://ex.noerr.eu.org/t/1119336

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

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

© 2021 V2EX