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

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

  •  
  •   wsseo · 18 小时 10 分钟前 · 527 次点击

    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
    }
    
    
    DefoliationM
        1
    DefoliationM  
       14 小时 42 分钟前 via Android
    ts 就这样吧,感觉还好。go 的那个也挺麻烦的。
    xausky
        2
    xausky  
       13 小时 51 分钟前
    和 dart 很像
    flyqie
        3
    flyqie  
       11 小时 20 分钟前 via Android
    啥业务非得用这个语言啊...

    难道是国产化要求用了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4513 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 01:03 · PVG 09:03 · LAX 18:03 · JFK 21:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.