Я пишу сетевое приложение.
Предположим, класс называется Пакет . Этот класс имеет некоторые общедоступные свойства.
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);
}