c# - 如果我不知道正确的类型,如何反序列化一个对象?

标签 c# .net serialization client-server deserialization

嗯,我想在客户端和服务器之间发送命令和数据。

我有三个项目:

  • 客户
  • 服务器
  • Common - 这里我放了common类和网络抽象层

我正在使用以下数据结构进行客户端和服务器之间的通信

public class Packet<T>
{
        public string Name { get; set; }
        public string From { get; set; }
        public string To { get; set; }
        public PacketType PacketType { get; set; }
        public T Container { get; set; }

        public Packet()
        {
        }

        public Packet(string name, PacketType packetType, T container)
        {
            Name = name;
            PacketType = packetType;
            Container = container;
        }
    }

    public enum PacketType
    {
        Command,
        Data
    }

如果我需要发送有关文件的信息,我只需创建一个具有必要结构的数据包 CreatePacket<FilesInfo>(filesInfo)然后将其序列化并发送到客户端\服务器。

但是我如何在接收端反序列化数据呢?我不知道数据包是什么对象类型。有没有其他方法或图书馆或其他东西来解决我的问题?我也不想使用 WCF,因为我的应用程序应该可以在安装了 .NET 2.0 的机器上运行。

最佳答案

chrfin 和 haiyyu 都有相同的好主意。下面是使用 Packet Base 类来保存构造类型数据的小改动。您序列化一个 Packet< T > 并反序列化为一个 Packet。那么使用就很简单了。已经提到的技巧仍然是使类型易于访问。

class Program
{
    static void Main(string[] args)
    {
        var pack = new Packet<int>() { Payload = 13 };
        var serializedData = pack.Serialize();
        var deserializedData = Packet.Deserialize(serializedData);
        Console.WriteLine("The payload type is:" + deserializedData.PayloadType.Name);
        Console.WriteLine("the payload is: " + deserializedData.Payload);
        Console.ReadLine();
    }
}



[Serializable]
public class Packet
{
    public Type PayloadType { get; protected set; }
    public object Payload { get; protected set; }
    public static Packet Deserialize(byte[] bytes)
    {
        return (Packet)(new BinaryFormatter()).Deserialize(new MemoryStream(bytes));
    }
}

[Serializable]
class Packet<T> : Packet
{
    public Packet()
    {
        PayloadType = typeof(T);
    }
    public new T Payload 
    {
        get { return (T)base.Payload; } 
        set { base.Payload = value; } 
    }

    public override string ToString()
    {
        return "[Packet]" + Payload.ToString();
    }

    public byte[] Serialize()
    {
        MemoryStream m = new MemoryStream();
        (new BinaryFormatter()).Serialize(m, this);
        return m.ToArray();
    }
}

关于c# - 如果我不知道正确的类型,如何反序列化一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9179205/

相关文章:

c# - 阅读 Jon Skeet 关于引用与值的章节。还是一头雾水

c# - 方法 X 不支持转换为 SQL - bool 值和日期时间

c# - 正则表达式匹配字符串中的连字符 0 次或 1 次

c# - 我应该处理 XmlNodeList

c# - .NET IL .maxstack 指令如何工作?

java - JBoss EAP 更新到 7.2.1 后如何处理 WELD-001477?

serialization - Spring中的依赖注入(inject)和序列化对象

c# - 如何在 Windows 机器上为 Linux 编译 .NET Core 应用程序

.net - 如何在不强制用户引用两个程序集的情况下从程序集中继承类

scala - 为什么方法参数会导致 Mockito 的 NotSerializableException?