你如何序列化和反序列化枚举?

Posted

技术标签:

【中文标题】你如何序列化和反序列化枚举?【英文标题】:How do you serialize and deserialize an enum? 【发布时间】:2015-09-28 17:38:18 【问题描述】:

我正在尝试使用 VB.NET 中的电机控制命令创建一个枚举。我想在一台计算机上设置命令,对其进行序列化,通过 TCP 连接将其发送到另一台计算机,反序列化并解释命令。我知道如何使用 TCP 连接,但我缺少关于枚举的概念性知识。我正在使用 Protobuf-net 进行序列化并具有以下命令描述。

Public Class RemoteControl

   <ProtoContract>
    Public Class Command

       <ProtoContract>
       Enum CommandAction
        <ProtoMember(2)>
        HOME_MOTOR

        <ProtoMember(1)>
        MOVE_ABS
        End Enum
   End Class
 End Class

我的问题是,如何将 RemoteControl 对象的实例设置为我想要的操作?我知道枚举使用整数,所以要发送 MOVE_ABS(标签为 1),我尝试了

 Dim myAction As New RemoteControl
 myAction.Command.CommandAction = 1

这返回了一个错误,提示“CommandAction 是一种类型,不能用作表达式”。

另外,一旦我设法弄清楚如何发送此命令,我将如何在另一台计算机上解释它?如果发送的命令是MOVE_ABS,那么类似RemoteControl.Command.CommandAction 的反序列化值是否等于1?

【问题讨论】:

我过去必须做的是使映射到enum 的属性成为integer,并在反序列化数据后直接将属性转换为enum 值通过电线发送。这要求枚举要么在双方都可以看到的 DLL 中,要么在通信双方单独声明。可能不是最好的解决方案,但它确实有效。 感谢您的建议。我的枚举将在双方声明,所以我会考虑到这一点。 【参考方案1】:

像往常一样,我花了几天的时间在这个问题上,然后在发布这篇文章后立即想通了。

我最终做的是:

SERVER SIDE
Dim realProto As New RemoteControl.Command.CommandAction
realProto = RemoteControl.Command.CommandAction.MOVE_ABS
ProtoBuf.Serializer.SerializeWithLengthPrefix(myStream, realProto, ProtoBuf.PrefixStyle.Fixed32)


CLIENT SIDE
Dim readProto As New RemoteControl.Command.CommandAction
readProto = Protobuf.Serializer.DeserializeWithLengthPrefix(Of RemoteControl.Command.CommandAction)(myStream, Protobuf.PrefixStyle.Fixed32)

然后将readProto 设置为RemoteControl.Command.CommandAction,其值是与动作标签对应的整数,或者我可以使用readProto.ToString 来查看动作的名称。

【讨论】:

以上是关于你如何序列化和反序列化枚举?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gson 序列化和反序列化枚举 [重复]

如何将远程 crate 的枚举序列化和反序列化为数字?

Jackson:将枚举值序列化和反序列化为整数

unity含枚举类型json数据的序列化和反序列化

unity含枚举类型json数据的序列化和反序列化

根据另一个字段值序列化和反序列化一个字段