десериализация нескольких типов из потока

У меня есть программа для карточных игр, и до сих пор чат отлично работает с потоками TCPClient между хостом и клиентом. Я хочу сделать это с помощью сериализации и десериализации, чтобы я мог также передавать карты между хостом и клиентом. Я попытался создать отдельный поток TCPClient для передачи карточек, но это не сработало, и я подумал, что может быть проще сохранить один поток TCPClient, который получает текстовые сообщения, а также карточки. Итак, я создал класс под названием cereal, у которого есть свойства для карточек, которые помогут мне восстановить карточку из встроенной базы данных карточек на другом конце. Есть ли способ заставить мою программу определить, была ли карта помещена в поток или это просто текст в потоке, чтобы я мог правильно десериализовать ее в строку или в хлопья? Или мне следует добавить строковое свойство к моему классу хлопьев, и когда это свойство будет заполнено после десериализации в хлопья, я буду знать, что это просто текст (если это поле будет пустым после десериализации, я буду знать, что это карта)? Я думаю о попытке улова, где он пытается десериализоваться в строку, и если это не удается, он будет пойман и брошен как зерно. Или я просто не в курсе и должен выбрать другой маршрут? Я использую Visual Studio 2011, использую двоичный форматтер и новичок в сериализации / десериализации.


person codenaugh    schedule 24.11.2012    source источник


Ответы (2)


Это должно сработать для вас. Отправьте BaseMessage по сети, а затем проверьте, какой тип пришел.

пространство имен ConsoleApplication3 {класс Program {static void Main (string [] args) {BaseMessage bm = new CardMessage (); if (bm.GetType () == typeof (CardMessage)) {}}}

class BaseMessage : ISerializable
{
}

class ChatMessage : BaseMessage
{
}

class CardMessage : BaseMessage
{
}

}

person ashcliffe    schedule 24.11.2012

Закончил создание класса контейнера, который можно сериализовать. Если я отправляю текст на другой компьютер, я устанавливаю для свойства text контейнера значение любого текста. Затем, когда этот контейнер будет получен, если в нем есть текст, принимающий компьютер отобразит текст. Если полученный контейнер содержит карту, он создаст карту и поместит ее в нужное место на основе дополнительных свойств, обнаруженных в полученном контейнере. Если это сброс, то он находит карту на основе дополнительных свойств в контейнере и сбрасывает ее в нужную стопку. Я также включил команду как свойство String в контейнер, поэтому, если все остальные свойства ложны, он увидит, имеет ли свойство команды строку или нет. Если это так, вызывает метод полученной команды, находит правильную команду и выполняет код. Пока работает отлично.

person codenaugh    schedule 09.01.2013