通过网络接收序列化自定义消息类型,如何投射?

时间:2011-06-29 02:39:25

标签: c# .net casting network-programming

我正在编写网络应用程序。

假设一个名为数据包的类。这个类有一些公共属性。

public class Packet
{
    public Module DestinationModule { get; set; }
    public EncryptionCompressionFlag EncryptedOrCompressed { get; set; }
    public PacketPriority Priority { get; set; }
    public Origin Origin { get; set; }

    // You'll see why I need this later
    // This StackOverflow question is asking how I can do without this property
    public Type UltimateType { get; set; }
}

现在假设一个名为 LoginPacket 的类。此类扩展数据包,并包含更多属性。

public class LoginPacket : Packet
{
    public string Username { get; set; }
    public string Password { get; set; }
}

LoginPacket 不是唯一的自定义数据包类型。还有更多自定义数据包。

我的客户端应用程序不断地序列化自定义数据包并通过网络发送它们。但是,当它们在另一端反序列化时,我只能将它们反序列化为数据包,而不是特定的 LoginPacket

问题:如何知道数据包的“最终”或“原始”特定类型?根据示例,特定类型将是 LoginPacket 。我不知道具体的类型,因为我通过网络接收它只是作为数据包而没有“类型”属性(如 UltimateType ,这听起来很蹩脚),我不知道如何发现具体的原始类型。

回复:“你如何序列化数据包?”

我使用YAXSerializer。我测试了 LoginPacket 的特定序列化和反序列化,并且它成功了。我能够将字符串( YAX序列化为字符串,而不是字节数组,差异并不重要...... )反序列化为数据包 a LoginPacket

    public static string SerializePacket(Packet packet)
    {
        YAXSerializer serializer = new YAXSerializer(packet.UltimateType);
        return serializer.Serialize(packet);
    }

1 个答案:

答案 0 :(得分:1)

根据YAXSerializer文档,每个类的开头XML元素是类名...所以你的字符串中的每个LoginPacket应该看起来像......

<LoginPacket ...>
    ....
</LoginPacket>

如果您不想将其放在“Packet”类的属性中,只需自己解析字符串并查找类名。