【问题标题】:How to convert Object to bytearray (any object to List<int>)如何将对象转换为字节数组(对象到 List<int>)
【发布时间】:2019-09-02 02:04:02
【问题描述】:

如何将对象转换为列表(数组字节) 我有 MyClass 类的实例(某个对象),我想从这个对象中获取字节。如何实现?

代码:

class MyClass {}

var myClass = MyClass()

List<int> getBytesFromObject(Object object) {
    // ??? what here should be ???
}

// so I can use it like:
List<int> bytes = getBytesFromObject(myClass)

【问题讨论】:

    标签: arrays object serialization dart converters


    【解决方案1】:

    没有将 Dart 对象序列化为二进制的内置方法。但是您可以将 Dart 对象转换为 JSON 字符串并将此字符串转换为字节数组(稍后将字节数组转换回字符串并将此字符串转换为对象)。这两者都是“dart:convert”包的一部分:

    https://api.dartlang.org/stable/2.2.0/dart-convert/json-constant.html

    https://api.dartlang.org/stable/2.2.0/dart-convert/utf8-constant.html

    请注意,您需要在自定义类上手动实现“toJson()”方法。有一些包可以帮助您生成必要的代码:

    https://pub.dartlang.org/packages/json_serializable

    【讨论】:

      【解决方案2】:

      正如@julemand101 提到的,没有内置的方法可以为您神奇地序列化对象。无论您是想序列化为某种字符串还是二进制格式,您都需要选择类的哪些字段用于持久性,哪些字段仅是暂时的。当涉及到反序列化时,您必须从核心考虑哪些字段对于从头开始重构对象是绝对必要的。

      关于二进制序列化:我尽量避免不惜一切代价重新发明轮子。 pub.dev 上有一些软件包可以很好地帮助您,例如:

      您需要确定您的用例提出了哪些要求,以及哪个包可以满足给定的约束。对于通用且面向未来的解决方案,您希望查看Google Protobuf:它还提供二进制序列化,它实际上会通过要求您在.proto 文件中指定要序列化的信息和然后protoc 编译器会为您生成所需的代码。 我的用例要求我实现特定的二进制输出文件格式,但如果可以选择,我会使用 Protobuf

      【讨论】:

        【解决方案3】:

        您可以使用 java stream 概念,基本上可以让您将任何对象转换为数组,您可以使用 Arrays.asList()方法将其转换为列表>。 这是一个简单的例子:

         List objectToList(Object obj){
                   ByteArrayOutputStream bos = new ByteArrayOutputStream();       
                   ObjectOutputStream oos = new ObjectOutputStream(bos);       
                   oos.writeObject(obj); 
                   byte [] data = bos.toByteArray();
                   return data.asList();
        
           }
        

        【讨论】:

        • 埃齐奥,我怎样才能用飞镖做这个?我不确定这一点。请附上一个例子好吗?
        • 对不起,我帮不了你……我虽然你用的是 java :(
        • Arrays.aslist 是静态方法,不能调用 Array 的实例
        • 这是一个飞镖问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 2018-09-08
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多