Что требуется, так это то, что у него есть способ преобразовать члены в числовые ключи. Это может принимать форму встроенных атрибутов — например, он допускает [DataContract]
/[DataMember(Order=key)]
, [XmlType]
/[XmlElement(Order=key)]
или [ProtoContract]
/[ProtoMember(key)]
.
Есть также варианты через [DataContract]
для вывода контракта в алфавитном порядке, но это безопасно только в том случае, если тип вашего контракта не собирается меняться в будущем; для этого добавьте:
[ProtoContract(InferTagFromName = true)]
к типу (возможно, частично, см. ниже). Это относится непосредственно к сценарию, который вы представляете, где [DataMember]
указывает на участников, но не имеет определенного Order
. Лично я предпочитаю явные макеты для стабильности.
Другой вариант даже не нуждается в подсказках вроде [DataMember]
; вы можете попросить его применить либо правила BinaryFormatter
(все поля, общедоступные или частные), либо правила XmlSerializer
(общедоступные элементы, свойства или поля); опять же, это очень нестабильно, если ваш тип изменится!
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
Но; другой распространенный сценарий заключается в том, что у вас есть типы, поступающие из генератора, которые вы не можете удобно редактировать, поскольку любые изменения будут потеряны при повторной генерации; для этого сценария могут быть полезны partial
классов. Вы не можете добавлять атрибуты к участникам через атрибуты, но здесь может помочь [ProtoPartialMember]
. Например, в отдельном файле кода:
[ProtoContract]
[ProtoPartialMember(key, memberName)]
[ProtoPartialMember(anotherKey, anotherMemberName)]
...
public partial class Order {}
Иногда у вас нет какого бы то ни было доступа к типу, поэтому добавление атрибутов любого типа невозможно. Если ваш сценарий соответствует описанию ([DataContract/
[DataMember], no
Order`), то ленивый параметр должен включить это глобально:
Serializer.GlobalOptions.InferTagFromName = true;
or in v2:
RuntimeTypeModel.Default.InferTagFromNameDefault = true;
Для более сложных сценариев в v2 есть новая модель MetaType
, посвященная этому, где вы можете настроить макет во время выполнения:
RuntimeTypeModel.Default.Add(typeof(Order), false)
.Add(key, memberName).Add(anotherKey, anotherMemberName);
или если ваши ключи 1, 2, 3,... тогда просто:
RuntimeTypeModel.Default.Add(typeof(Order), false)
.Add(memberName, anotherMemberName, ...);
(на MetaType
есть множество опций для управления всеми аспектами сериализации)
Я думаю, что здесь описано большинство вариантов!
person
Marc Gravell
schedule
18.11.2011