Десериализовать себя - PullRequest
9 голосов
/ 23 марта 2011

Хорошо, возможно, у меня просто эпический сбой, но мой разум хочет сказать, что это должно сработать.

Предположим, что DataProtect.DecryptData принимает зашифрованную строку в качестве ввода и дешифрованную строку в качестве вывода. Предположим, deserializeXML создает соответствующий объект и возвращает его из только что расшифрованной строки.

Итак. Почему бы это не сработало?

class ArrivedDetails
{
///...

    internal ArrivedDetails(string encrypted)
    {
        this = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
    }
///...

дает мне ошибку

Cannot assign to '<this>' because it's read only

Точнее говоря, как я могу заставить это работать? По сути, я хочу расшифровать сериализованную версию XML объекта и затем десериализовать ее в конструкторе.

Я открыт для «вы не можете» (с объяснением), поскольку я могу поместить его в другое место и просто назначить значения, но мой разум говорит, что нечто подобное должно быть возможным.

Ответы [ 4 ]

16 голосов
/ 23 марта 2011

Нет, это невозможно с помощью конструктора, вы не можете переназначить this.

Вместо этого используйте статический метод:

public static ArrivedDetails CreateFromString(string encrypted)
{
    return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
}

Назовите это:

ArrivedDetails details = ArrivedDetails.CreateFromString(encrypted);
3 голосов
/ 04 января 2014

Вы можете архивировать это с помощью отражения следующим образом.

A config = DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
foreach (var property in GetType().GetProperties())
    if (property.GetCustomAttributes(typeof (XmlIgnoreAttribute), false).GetLength(0) == 0)
        property.SetValue(this, property.GetValue(tmp, null), null);

Это назначает десериализованный объект временной переменной и копирует значение в каждом открытом свойстве в this с отражением.Этот фрагмент позволяет избежать копирования свойств с атрибутом XmlIgnore.

3 голосов
/ 23 марта 2011

Вы не можете ничего присвоить «этому».Замените ArriveDetails на статический, который возвращает десериализованный объект.

class ArrivedDetails
{
    static ArrivedDetails Create(string encrypted)
    { return DataProtect.deserializeXML(...) }
}
2 голосов
/ 23 марта 2011

Вам нужен статический фабричный метод, который создает требуемый объект.

class ArrivedDetails
{
///...

    public static ArrivedDetails CreateFromEncryptedKey(string encrypted)
    {
        return DataProtect.deserializeXML(DataProtect.DecryptData(encrypted));
    }
///...

Причина, по которой ваш первоначальный подход не сработал, заключается в том, что this является частным полем экземпляра только для чтения, котороевозвращает объект, из которого он вызван.Вы не можете написать this.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...