Combined
, который расширяет черты A with D with C with B
class Combined extends A with D with C with B {
final <superaccessor> <artifact> def super$foo(): String = B$class.foo(Combined.this);
override def foo(): String = C$class.foo(Combined.this);
final <superaccessor> <artifact> def super$foo(): String = D$class.foo(Combined.this);
final <superaccessor> <artifact> def super$foo(): String = Combined.super.foo();
def <init>(): Combined = {
Combined.super.<init>();
D$class./*D$class*/$init$(Combined.this);
B$class./*B$class*/$init$(Combined.this);
C$class./*C$class*/$init$(Combined.this);
()
}
};
Вы можете читать слева направо. Вот небольшой пример. Три черты будут печатать свое имя при инициализации, то есть расширенной:
scala> trait A {println("A")}
scala> trait B {println("B")}
scala> trait C {println("C")}
scala> new A with B with C
A
B
C
res0: A with B with C = $anon$1@5e025e70
scala> new A with C with B
A
C
B
res1: A with C with B = $anon$1@2ed94a8b
Итак, это основной порядок линеаризации. Таким образом, последний будет перезаписывать предыдущий.
Ваша проблема немного сложнее. Поскольку ваши черты уже расширяют другие черты, которые сами переопределяют некоторые значения предыдущих признаков. Но порядок инициализации left to right
или right will override left
.
Вы должны иметь в виду, что сам признак будет инициализирован первым.
Вам нужно ISerializable
здесь? Кем был постоянный клиент DataContractSerializer
не давая Вам? Если Вы переключаетесь назад на это, это должно хорошо работать.
В основном, путем реализации пользовательской сериализации, данные больше не являются базирующимся контрактом - таким образом, это должно включать эту дополнительную информацию, чтобы гарантировать, что это может понять это позже.
Так: есть ли причина реализовать ISerializable
в этом случае?
Если Вы хотите полный контроль над сериализацией к xml, можно использовать демонстрационный код сериализации XmlSerializer
public class Test
{
[XmlIgnore]
public Nullable<int> NullableNumber = 7;
[XmlElement("NullableNumber")]
public int NullableNumberValue
{
get { return NullableNumber.Value; }
set { NullableNumber = value; }
}
public bool ShouldSerializeNullableNumberValue()
{
return NullableNumber.HasValue;
}
[XmlElement]
public int Number = 5;
}
:
static void Main(string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(Test));
serializer.Serialize(Console.Out, new Test());
}
результаты:
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Number>5</Number>
<NullableNumber>7</NullableNumber>
</Test>