сериализация свойства RSAKeyValue в классе Serializable

У меня есть класс в моем проекте С#, отмеченный атрибутом [Serializable]. Он имеет свойство типа RSAKeyValue:

[XmlElement(PUBLIC_KEY_TAG_NAME)]
public RSAKeyValue Key { get; private set; }

Когда я пытаюсь сериализовать экземпляр моего класса в XML, а затем десериализовать этот XML обратно в экземпляр моего класса, я получаю:

System.InvalidOperationException: System.Security.Cryptography.KeySizes не может быть сериализован, так как у него нет конструктора без параметров.

Это происходит, когда я вызываю XmlSerializer.Serialize. Я уверен, что это из-за свойства RSAKeyValue в моем классе, поскольку все остальные свойства, которые сериализуются, представляют собой простые строки. Что я могу с этим поделать? Должен ли я, возможно, создать свой собственный класс-оболочку вокруг экземпляра RSAKeyValue, который правильно сериализует/десериализует?

Вот пример XML, который можно десериализовать в экземпляр RSAKeyValue:

<RSAKeyValue>
  <Modulus>long string here...</Modulus>
  <Exponent>short string here</Exponent>
</RSAKeyValue>

person Sarah Vessels    schedule 20.07.2010    source источник


Ответы (1)


Во-первых, сериализатор XML игнорирует атрибут [Serializable].

Во-вторых, если класс не имеет конструктора по умолчанию, вы не можете сериализовать его с помощью сериализатора XML, и точка.

Что вы пытаетесь достичь? Возможно, вы можете сделать то же самое с помощью Data Contract Serializer?


Создайте класс, который содержит только модуль и экспоненту. Заполните этот класс из RSAKeyValue. Сериализуйте свой пользовательский класс. После десериализации используйте его для создания нового RSAKeyValue.

person John Saunders    schedule 20.07.2010
comment
Я хочу иметь возможность хранить части модуля и экспоненты RSAKeyValue в XML-документе вместе с другими данными. Я хочу иметь возможность читать XML из файла и анализировать его в экземпляре моего класса, затем получить доступ к свойству Key и получить экземпляр некоторого класса, содержащего модуль и экспоненту, которые были сохранены в XML. - person Sarah Vessels; 20.07.2010
comment
Тогда вы сами ответили на свой вопрос. Создайте класс, который содержит только модуль и экспоненту. Заполните этот класс из RSAKeyValue. Сериализуйте свой пользовательский класс. После десериализации используйте его для создания нового RSAKeyValue. - person John Saunders; 20.07.2010
comment
Хм. С твоими причудливыми идеями... ;) Сейчас работаю над этим; Благодарность! - person Sarah Vessels; 20.07.2010
comment
Джон, ты должен опубликовать свой комментарий в качестве ответа, потому что это то, что я в итоге сделал, и это сработало для меня. Я бы отметил ваш как выбранный ответ! - person Sarah Vessels; 21.07.2010