将形状接口{}转换为[]字节会导致“值不是固定大小的”(二进制编码器)或“没有导出的字段”(gob),但我无法更改结构

问题描述 投票:0回答:1

我有一个

shape interface{}
描绘了圆形、正方形或其他东西。
我需要将其作为
binary
数组中的
[]byte
返回。

  1. 如果我使用
    binary
    编码器
import "encoding/binary"
var buffer bytes.Buffer
errCvtBytes := binary.Write(&buffer, binary.BigEndian, shape)

我收到错误消息:

_binary.Write: some values are not fixed-sized in type xml.Circle_

  1. 如果我使用
    gob
    编码器:
import "encoding/gob"
var buffer bytes.Buffer
enc := gob.NewEncoder(&buffer)
gob.Register(xml.Circle{})
   /* ... others registrations ... */
errCvtBytes := enc.Encode(shape)

gob: type util.DateTime has no exported fields

在这两种情况下,编码器肯定是正确的!
给定的结构对于某些结构可能具有可变长度值,而对于其他结构则没有导出字段。

但它们不是我的。我无法改变任何这些作为规范给予我的结构。他们保持原样。完全正确。

知道了这一点,我还有办法让 Go 成功地将具有这些结构之一的对象转换为二进制吗?
要尝试第三个编码器吗?

go encoding
1个回答
0
投票

当您想要控制您可能无法控制或可能更改的业务对象的序列化格式时,将数据复制到您自己的结构中会很有帮助。与序列化相比,复制通常相当便宜,您可以根据需要注释结构并相应地对其进行版本控制,例如保留旧版本。

无论您的业务逻辑的最佳表示是什么,都可能不符合定义的序列化格式的要求。

© www.soinside.com 2019 - 2024. All rights reserved.