C # - Сериализация пакетов по сети - PullRequest
1 голос
/ 20 декабря 2011

Я разрабатываю сетевое приложение, которое отправляет много пакетов.В настоящее время мой метод сериализации - это просто взлом, где он берет список объектов и преобразует их в строку, разделенную символом канала '|'и сбрасывает его в сетевой поток (или просто отправляет его через UDP).

Я ищу более чистое решение для этого в C #, минимизируя размер пакета (поэтому не нужно выполнять сериализацию XML).

Мой опыт работы с BinaryFormatter is SLOW.Я также рассматриваю возможность сжатия моих пакетов путем кодирования их в base64 строк и их декодирования на стороне клиента.Я хотел бы узнать, как это повлияет на производительность моего приложения.

Кроме того, еще один быстрый вопрос:

Моя установка создает 2 сокета (один TCP and UDP), и клиент подключаетсяиндивидуально к этим двум розеткам.Данные сбрасываются либо по мере необходимости (TCP для важных вещей, UDP для неважных вещей).Я впервые использую TCP / UDP одновременно, и мне было интересно

, существует ли более унифицированный метод, хотя это не так.

Как всегда, спасибо запотрясающая поддержка.

Ответы [ 4 ]

2 голосов
/ 20 декабря 2011

Я бы использовал двоичный протокол, подобный Буферы протокола Google .Используя protobuf-csharp-port Джона Скита , можно использовать методы WriteDelimitedTo и MergeDelimitedFrom для IMessage и IBuilder соответственно.Они будут префикс сообщения с количеством байтов, так что они могут быть использованы на другом конце.Определить сообщения очень просто:

message MyMessage {
    required int32 number = 1;
}

Затем вы создаете классы C # с помощью ProtoGen.exe и просто отправляетесь в город.Одним из больших преимуществ для протобуферов (в частности, protobuf-csharp-port) является то, что не все конечные точки необходимо обновлять одновременно.Новые поля могут быть добавлены и использованы предыдущими версиями без ошибок.Эта независимость от версии может быть очень мощной, но также может укусить вас, если вы не планируете ее;)

1 голос
/ 20 декабря 2011

Вы можете использовать ProtoBuf для сериализации

0 голосов
/ 20 декабря 2011

Я занимаюсь разработкой сетевого приложения, которое отправляет много пакетов

Извлечение networkComms.net , библиотека сетевого взаимодействия с открытым исходным кодом, может спасти васНемного времени.Он включает в себя protobuf для сериализации, пример которого здесь , строка 408.

0 голосов
/ 20 декабря 2011

Я лично использовал следующую систему: Имею абстрактный класс Packet, все пакеты получены из.Класс пакета определяет два виртуальных метода:

void SerializeToStream(BinaryWriter serializationStream)
void BuildFromStream(BinaryReader serializationStream)

Эта ручная сериализация позволяет создавать пакеты небольшого размера.Перед отправкой в ​​сокет пакеты имеют префикс длины и префикс с уникальным идентификатором типа пакета.Получающий конец может затем использовать Activator.CreateInstance для создания соответствующего пакета и вызвать BuildFromStream для восстановления пакета.

Пример пакета:

class LocationUpdatePacket : Packet
{
   public int X;
   public int Y;
   public int Z;

   public override void SerializeToStream(BinaryWriter serializationStream)
   {
         serializationStream.Write(X);
         serializationStream.Write(Y);
         serializationStream.Write(Z);
   }
   public override void BuildFromStream(BinaryReader serializationStream)
   {
         X = serializationStream.ReadInt32();
         Y = serializationStream.ReadInt32();
         Z = serializationStream.ReadInt32();
   }
}
...