从流中反序列化多个类型

时间:2012-11-24 22:49:15

标签: visual-studio serialization types deserialization binaryformatter

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

2 个答案:

答案 0 :(得分:1)

这对你有用。通过线路发送BaseMessage,然后检查进入的类型。

命名空间ConsoleApplication3 {     课程     {         static void Main(string [] args)         {             BaseMessage bm = new CardMessage();             if(bm.GetType()== typeof(CardMessage))             {             }         }     }

class BaseMessage : ISerializable
{
}

class ChatMessage : BaseMessage
{
}

class CardMessage : BaseMessage
{
}

}

答案 1 :(得分:0)

结束创建可序列化的容器类。如果我将文本发送到另一台计算机,我将容器的text属性设置为文本。然后,当收到此容器时,如果它有文本,则接收计算机将显示该文本。如果收到的容器包含一张卡片,它将根据收到的容器中的其他属性创建卡片并将其放置在需要的位置。如果它是丢弃,则它根据容器中的其他属性找到卡,并将其丢弃到正确的堆中。我还在容器中包含一个命令作为String属性,因此如果所有其他属性都为false,它将查看命令属性是否有字符串。如果是,则调用命令receive方法并找到正确的命令并执行代码。到目前为止工作得很好。