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

117
9

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

спросил(а) 2021-01-25T13:11:29+03:00 5 месяцев назад
1
Решение
63

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

namespace ConsoleApplication3 {class Program {static void Main (string [] args) {BaseMessage bm = new CardMessage(); if (bm.GetType() == typeof(CardMessage)) { } } } if (bm.GetType() == typeof (CardMessage)) {}}}

class BaseMessage : ISerializable
{
}

class ChatMessage : BaseMessage
{
}

class CardMessage : BaseMessage
{
}

}

ответил(а) 2021-01-25T13:11:29+03:00 5 месяцев назад
45

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

ответил(а) 2021-01-25T13:11:29+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема