Переопределение свойства с атрибутом

Другой вариант заключается в создании групповых индексов для разделения с помощью rle

rl <- rle(sub("-.*", "", names(data)))
split.default(data, rep(1:length(rl), rl$length))
#

Другой вариант заключается в создании групповых индексов для разделения с помощью rle

1` # B-DIODE B-DIODE.1 #1 1.2 1.3 #2 0.4 0.6 # #

Другой вариант заключается в создании групповых индексов для разделения с помощью rle

2` # A-DIODE A-ACC1 A-ACC2 A-ANA0 A-ANA1 A-BRICKID A-CC0 A-CC1 A-DIGDN A-DIGDP #1 1.4 1.5 1.6 1.7 1.8 1.9 2 2.1 2.2 2.3 #2 0.8 1.0 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 # A-DN1 A-DN2 A-DP1 A-DP2 A-SCL A-SDA A-USB0DN A-USB0DP A-USB1DN A-USB1DP #1 2.4 2.5 2.6 2.7 2.8 2.9 3 3.1 3.2 3.3 #2 2.8 3.0 3.2 3.4 3.6 3.8 4 4.2 4.4 4.6 # A-ACC1.1 A-ACC2.1 A-ANA0.1 A-ANA1.1 A-BRICKID.1 A-CC0.1 A-CC1.1 A-DIGDN.1 #1 3.4 3.5 3.6 3.7 3.8 3.9 4 4.1 #2 4.8 5.0 5.2 5.4 5.6 5.8 6 6.2 # A-DIGDP.1 A-DN1.1 A-DN2.1 A-DP1.1 A-DP2.1 A-SCL.1 A-SDA.1 A-USB0DN.1 #1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 #2 6.4 6.6 6.8 7.0 7.2 7.4 7.6 7.8 # A-USB0DP.1 A-USB1DN.1 A-USB1DP.1 A-NA A-ACC2PWRLKG_0v4 A-ACC2PWRLKG_0v4.1 #1 5 5.1 5.2 5.3 5.4 5.5 #2 8 8.2 8.4 8.6 8.8 9.0 # A-P_IN_Leak #1 5.6 #2 9.2
.
10
задан Chris Sinclair 31 July 2013 в 20:05
поделиться

2 ответа

Во-первых, [сериализуемый] attr не имеет никакого отношения к XmlSerializer. Это - отвлекающий маневр. [Сериализуемый] значимо для Системы. Время выполнения. Сериализация, в то время как XmlSerializer живет в Системе. Xml. Сериализация. При украшении класса [сериализуемым] и участников с [XmlIgnore] затем, Вы, вероятно, смущаете себя или других читателей Вашего кода.

XmlSerialization в.NET очень гибок. В зависимости от того, как сериализация делается, непосредственно Вами или косвенно, скажем, временем выполнения веб-сервисов - у Вас есть различные способы управлять вещами.

Одна опция состоит в том, чтобы использовать propertyNameSpecified шаблон для включения или выключения свойства в Сериализации XML. Предположим, что у Вас есть этот код:

public class TypeA
{ 
  public DateTime LastModified;
  [XmlIgnore]
  public bool LastModifiedSpecified;
}

Затем если LastModifiedSpecified будет ложью в экземпляре, то поле LastModified не будет сериализировано для того экземпляра. В конструкторе для Вашего типа можно установить LastModifiedSpecified, чтобы всегда быть верными в базовом типе и всегда лжи в производном типе. Фактическая булевская переменная - LastModifiedSpecified - никогда не сериализируется, потому что это - отмеченный XmlIgnore.

Этот небольшой прием документируется здесь.

Ваша другая опция состоит в том, чтобы использовать XmlAttributeOverrides, который является способом динамичного обеспечения набора атрибутов сериализации XML (как XmlElementAttribute, XmlIgnoreAttribute, XmlRootAttribute, и так далее...) - динамично обеспечение тех атрибутов к сериализатору во времени выполнения. XmlSerializer, вместо того, чтобы осмотреть сам тип для тех атрибутов, будет просто идти через список атрибутов переопределения, предоставленных его конструктору.

    var overrides = new XmlAttributeOverrides();
    // ....fill the overrides here....
    // create a new instance of the serializer specifying overrides
    var s1 = new XmlSerializer(typeof(Foo), overrides);
    // serialize as normal, here.

Это проиллюстрировано более подробно здесь.

В Вашем случае Вы обеспечили бы XmlIgnoreAttribute как переопределение, но только при сериализации производного типа. (или безотносительно) Это работает только при прямом инстанцировании XmlSerializer - он не будет работать, когда сериализация сделана неявно временем выполнения, как с веб-сервисами.

Удачи!

17
ответ дан 3 December 2019 в 16:31
поделиться

Лучшее я могу думать...

[Serializable]
public class Record
{
   public DateTime LastUpdated {get; set; }
   public virtual bool ShouldSerializeLastUpdated() {return true;}
   // other useful properties ...
}

public class EmployeeRecord : Record
{
   public string EmployeeName {get; set; }
   public override bool ShouldSerializeLastUpdated() {return false;}
   // other useful properties ...
}

В основном существует несколько шаблонов это XmlSerializer отношения; public bool ShouldSerialize*(), и public bool *Specified {get;set;} (обратите внимание, что необходимо отметить *Specified с [XmlIgnore] также...).

Не очень изящный, я предоставлю; но XmlSerializer только взгляды на общедоступных участников, таким образом, Вы не можете даже скрыть их (за исключением [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]).

8
ответ дан 3 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: