Универсальный сериализатор с ProtoBuf.net - PullRequest
2 голосов
/ 28 ноября 2011

Я пытаюсь написать универсальный сериализатор, используя protobuf.net v2. Однако я сталкиваюсь с некоторыми проблемами, которые заставляют меня задуматься, возможно ли то, что я делаю, невозможно. Сериализуемые объекты имеют неопределенный тип, к которому у меня нет доступа, поэтому я пытаюсь обойти объект и добавить его свойства в модель типа.

        var model = TypeModel.Create();
        List<string> propertiesToSerialize = new List<string>();
        foreach (var property in typeToSerialize.GetProperties())
        {
            propertiesToSerialize.Add(property.Name);
        }
        model.AutoAddMissingTypes = true;
        model.Add(typeToSerialize, true).Add(propertiesToSerialize.ToArray());

Для простых объектов, которые содержат только примитивы, это работает нормально. Однако при работе с объектом, который содержит, скажем, Dictionary , я сталкиваюсь с ошибкой, сообщающей, что для Object не зарегистрирован сериализатор.

Я смотрел на , сериализация словаря в ProtoBuf-net завершается с ошибкой , но, похоже, предлагаемое решение требует некоторых знаний и доступа к сериализуемому объекту.

Любые предложения о том, как я мог бы действовать?

1 Ответ

1 голос
/ 28 ноября 2011

protobuf-net не устанавливает для возможности сериализации каждого сценария (особенно тех, в которых доминирует object), точно так же, как XmlSerializer и DataContractSerializer имеют сценарии, которые онине могу моделировать.В частности, полное отсутствие метаданных в формате protobuf (часть того, почему они очень эффективны) означает, что только предназначено для потребления кодом, который заранее знает структуру данных - что являетсяневозможно, если слишком много object.

Тем не менее, есть некоторая поддержка через DynamicType=true, но в настоящее время она не будет включена для упомянутого вами сценария словаря.

В большинстве случаев, однако, это не совсем тот случай, когда данные могут быть чем угодно ;более типично существует конечное число ожидаемых типов данных.Когда это , то проблема object может быть решена более чистым способом с использованием немного другой модели (в частности, неуниверсального базового типа, универсального подтипа и нескольких "включить "варианты".Как и в случае с большинством сериализаций, существуют сценарии, в которых может быть желательно иметь отдельную модель «DTO», которая выглядит ближе к выводу сериализации, чем к модели вашего домена.

Последнее замечание: GetProperties () /Подход Add () не является надежным, поскольку GetProperties () не гарантирует какой-либо конкретный порядок для членов;с протоколом protobuf-net, как вы показываете, порядок важен, так как это помогает определить ключи для использования.Даже если порядок был фиксированным (например, сортировка по алфавиту), учтите, что добавление члена может быть серьезным изменением.

...