如何使用XmlSerializer反序列化未知对象类型?

时间:2017-10-19 15:59:41

标签: c# networking serialization

我有一个服务器和客户端,我使用XmlSerializer序列化数据包对象,并且由于另一端的类型未知,我创建了以下方法来处理它。

两个程序集都包含相同类型的数据包,因此只会发送已知类型。

public static class Serializer
{
    private static readonly List<Type> packetTypes;

    static Serializer()
    {
        packetTypes = new List<Type>()
        {
            typeof(Packets.ClientPackets.PlayerInformation),
            typeof(Packets.ClientPackets.DoSomething)
        };
    }

    public static IPacket Deserialize(byte[] buffer)
    {
        foreach (var t in packetTypes)
        {
            using (var ms = new MemoryStream())
            {
                try
                {
                    ms.Write(buffer, 0, buffer.Length);
                    ms.Seek(0, SeekOrigin.Begin);

                    var serializer = new XmlSerializer(t);
                    var tempObject = serializer.Deserialize(ms);


                    return (IPacket)tempObject;
                }
                catch (Exception)
                {
                }
            }
        }

        return null;
    }
}

所以它会循环遍历所有已知的类型。

现在这种方法很好,但是我想知道是否有更高效或者说正确的方法吗?这里有风险吗?

P.S。我仅限于无法使用任何外部库。

0 个答案:

没有答案