Я пытаюсь вручную десериализовать объекты из MemoryStream
, но MemoryStream
будет иметь разные типы объектов в нем, и мне нужно вызвать соответствующий метод в зависимости от типа объекта. Например, это как MemoryStream
отформатирован (тип объекта, то данные, повторяя):Десализируя различные типы объектов из MemoryStream эффективно
[object type (uint)][object data (variable length)][object type (uint)][object data (variable length)][object type (uint)][object data (variable length)]
Учитывая тип объекта, я знаю, сколько данных ожидать и чтения для данного типа объекта. Проблема, которую я испытываю, - это эффективный способ чтения этих данных.
Один из способов будут использовать переключатель заявление так:
switch (objectType) {
case 0:
SomeClass.LoadFromMemoryStream(memoryStream);
break;
case 1:
SomeOtherClass.LoadFromMemoryStream(memoryStream);
break;
case 2:
EvenAnotherClass.LoadFromMemoryStream(memoryStream);
break;
...
}
Каждый из различных классов, очевидно, нуждается в их собственном методе, чтобы загрузить данные из потока памяти и заранее указателя однако много байт подходящий для этого типа объекта.
Это кажется сложным для поддержания, когда существует сотни типов объектов, которые могут быть загружены таким образом, и несколько неэффективны, если для каждого объекта в потоке он должен выполнять итерацию с помощью сотен типов для определения того, что звонить.
Я подозреваю, что могу сделать это с помощью генериков, но не понимаю, как настроить классы и методы для поддержки этого. Является ли оператор switch лучшим подходом? Если нет, то что?
Создание игры через TCP? ^^ Не всегда хорошая идея. – AgentFire
Создание игры, но это для загрузки карты из файла. Карта уже загружена в память с помощью байтового массива, и я использую MemoryStream для легкого чтения своих данных с помощью таких функций, как ReadUInt16() – Todd
, почему вы не загружаете карту с диска? Кроме того, почему бы вам не использовать 4-байтную длину для каждого объекта переменной длины? – AgentFire