При использовании ISerializable с DataContractSerializer, как я мешаю сериализатору произвести информацию о типе?

, как компилятор видит класс 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.

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

11
задан Eric 2 April 2009 в 06:26
поделиться

2 ответа

Вам нужно ISerializable здесь? Кем был постоянный клиент DataContractSerializer не давая Вам? Если Вы переключаетесь назад на это, это должно хорошо работать.

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

Так: есть ли причина реализовать ISerializable в этом случае?

0
ответ дан 28 October 2019 в 02:41
поделиться

Если Вы хотите полный контроль над сериализацией к 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>
0
ответ дан 28 October 2019 в 02:41
поделиться
Другие вопросы по тегам:

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