你如何序列化和反序列化枚举?
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
来查看动作的名称。
【讨论】:
以上是关于你如何序列化和反序列化枚举?的主要内容,如果未能解决你的问题,请参考以下文章