2016-06-30 2 views
4

System.Tuple(T1,..) классы с пометкой [SerializableAttribute] (см. msdn). Но у них нет конструктора без параметров, поэтому он не сериализуется на XmlSerializer, поскольку он был очищен до here. Так почему бы не добавить его?Почему кортеж не имеет конструктора без параметров, а `[Serializable]`?

+3

Я не понимаю, почему это пропущено. Это довольно интересный вопрос для всех, кто знает, как должна работать сериализация. –

+4

Тот, кто голосовал за закрытие, потому что он «в основном основан на мнениях», явно не понимает вопроса. –

+0

@ThomasLevesque Вопрос заключается в том, чтобы просить людей угадать, почему этот класс рамки был разработан так, как он был. Это полностью основано на мнениях. Учитывая, что вы отправили ответ, который никоим образом не пытался ответить на заданный вопрос, а именно, почему этот класс не имеет конструктора без параметров, кажется, что вы тот, кто не понимает quesiton. – Servy

ответ

3

Вам не нужен тип, чтобы иметь атрибут [Serializable] для его сериализации с XmlSerializer, а тот факт, что тип имеет атрибут, не означает, что вы можете сериализовать его с помощью XmlSerializer; эти два не связаны друг с другом. [Serializable] используется только для двоичной сериализации (*) (для которой не нужен конструктор без параметров).

Подводя итог:

  • Binary сериализация
    • требует атрибута [Serializable]
    • не требует общественного конструктора без параметров
  • XML сериализации
    • не требует атрибута [Serializable]
    • требует public Беспараметрической конструктор

Таким образом, вы не можете сериализовать Tuple<...> с помощью XmlSerializer.


Независимо от вышесказанного, Tuple<...> может иметь конструктор по умолчанию, но это не имеет особого смысла: кортежи неизменны (вы не можете установить их свойства), так что если вы создали экземпляр с по умолчанию конструктор, свойства всегда будут иметь значения по умолчанию и не могут быть изменены. (Также, тот факт, что свойства только для чтения является также то, что мешает кортежи из сериализации с XmlSerializer, который поддерживает только свойства общественного чтения и записи)


(*) на самом деле, а не только двоичная сериализация, но любой форматировщик сериализации (например, BinaryFormatter, SoapFormatter ...)

+1

Этот тип юбок вокруг вопроса. Я считаю, что дух вопроса просто - почему Tuple не имеет открытого конструктора без параметров, поэтому его можно использовать с XmlSerializer? – bodangly

+0

@ bodangly OP, кажется, думает, что, поскольку Tuple является '[Serializable]', он должен иметь конструктор без параметров и быть сериализуемым с помощью 'XmlSerializable', что не так. –

+0

@bogdanly Я обновил свой ответ –

Смежные вопросы