【问题标题】:deserializing multiple types from a stream从流中反序列化多种类型
【发布时间】:2012-11-24 22:49:15
【问题描述】:

我有一个纸牌游戏程序,到目前为止,聊天在主机和客户端之间的 TCPClient 流上来回运行良好。我想通过序列化和反序列化来做到这一点,这样我也可以在主机和客户端之间传递卡片。我尝试为卡片的传递创建一个单独的 TCPClient 流,但它不起作用,并且认为保留一个获取文本消息和卡片的 TCPClient 流可能更容易。所以我创建了一个类,称为谷物,它具有卡片的属性,可以帮助我从另一端的嵌入式卡片数据库重建卡片。有没有办法让我的程序确定卡片是否已放入流中,或者它是否只是流中的文本,以便我可以正确地将其反序列化为字符串或谷物?或者我应该在我的谷物类中添加一个字符串属性,并且在反序列化为谷物后填充该属性时,我会知道它只是文本(如果反序列化后该字段为空,我会知道它是一张卡片)?我在想一个 try catch,它试图反序列化为一个字符串,如果它失败了,它会捕获并转换为谷物。或者我只是远离基地,应该选择另一条路线?我正在使用 Visual Studio 2011,正在使用二进制格式化程序,并且是序列化/反序列化的新手。

【问题讨论】:

    标签: visual-studio serialization types deserialization binaryformatter


    【解决方案1】:

    这应该适合你。通过网络发送 BaseMessage,然后检查输入的类型。

    命名空间 ConsoleApplication3 { 课堂节目 { 静态无效主要(字符串 [] 参数) { BaseMessage bm = new CardMessage(); if (bm.GetType() == typeof(CardMessage)) { } } }

    class BaseMessage : ISerializable
    {
    }
    
    class ChatMessage : BaseMessage
    {
    }
    
    class CardMessage : BaseMessage
    {
    }
    

    }

    【讨论】:

      【解决方案2】:

      最终创建了一个可序列化的容器类。如果我将文本发送到另一台计算机,我将容器的文本属性设置为任何文本。那么当这个容器被接收时,如果它有文本,接收计算机就会显示文本。如果接收到的容器包含一张卡片,它将创建卡片并根据在接收到的容器中找到的其他属性将其放置在需要去的地方。如果是弃牌,则根据容器中的附加属性找到该牌,并将其弃到正确的牌堆中。我还在容器中包含了一个命令作为字符串属性,所以如果所有其他属性都为假,它将查看命令属性是否具有字符串。如果是,则调用命令接收方法并找到正确的命令并执行代码。到目前为止效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 2021-09-09
        相关资源
        最近更新 更多