Получение сериализованных пользовательских типов сообщений по сети, как преобразовать? - PullRequest
1 голос
/ 29 июня 2011

Я пишу сетевое приложение.

Предположим, класс называется Пакет . Этот класс имеет некоторые общедоступные свойства.

public class Packet
{
    public Module DestinationModule { get; set; }
    public EncryptionCompressionFlag EncryptedOrCompressed { get; set; }
    public PacketPriority Priority { get; set; }
    public Origin Origin { get; set; }

    // You'll see why I need this later
    // This StackOverflow question is asking how I can do without this property
    public Type UltimateType { get; set; }
}

Теперь предположим, что класс называется LoginPacket . Этот класс расширяет Packet и включает в себя еще больше свойств.

public class LoginPacket : Packet
{
    public string Username { get; set; }
    public string Password { get; set; }
}

Но LoginPacket - не единственный тип пользовательского пакета. Есть еще много пользовательских пакетов.

Мое клиентское приложение постоянно сериализует пользовательские пакеты и отправляет их по проводам. Однако, когда они десериализованы на другой стороне, я могу десериализовать их только как пакет, а не как определенный LoginPacket .

Вопрос: Как я могу узнать «конечный» или «оригинальный» конкретный тип пакета? Согласно примеру, конкретный тип был бы LoginPacket . Я не знаю конкретный тип, потому что я получаю его по проводам просто как Packet и без свойства "type" (например, UltimateType , что звучит неубедительно), я не не знаю, как найти конкретный тип оригинала.

Ответ: «Как вы сериализуете пакет?»

Я использую YAXSerializer . Я протестировал определенную сериализацию и десериализацию LoginPacket , и она прошла успешно. Я смог десериализовать строку ( YAX сериализуется в строку, а не в байтовый массив, разница не имеет большого значения .. ) в Пакет и a LoginPacket .

    public static string SerializePacket(Packet packet)
    {
        YAXSerializer serializer = new YAXSerializer(packet.UltimateType);
        return serializer.Serialize(packet);
    }

1 Ответ

1 голос
/ 29 июня 2011

Согласно документации YAXSerializer, открывающий элемент XML для каждого класса - это имя класса ... поэтому каждый LoginPacket в вашей строке должен выглядеть следующим образом ...

<LoginPacket ...>
    ....
</LoginPacket>

Просто проанализируйте строку самостоятельно иищите имя класса, если вы не хотите помещать его в свойство класса Packet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...