XmlSerializer: как разрешить десериализацию свойства, но затем остановить сериализацию? - PullRequest
1 голос
/ 10 августа 2010

То есть, я бы хотел, чтобы мои данные пошли в одном направлении - передавались в класс, но затем предотвращали его сохранение во время операции сериализации. Какой лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Самый простой способ - сериализовать свойство, которое правильно выполняет Set, но всегда возвращает фиксированное, поддельное значение для Get. Например, если бы это свойство называлось Password, вы бы создали свойство SerializablePassword, которое соответствует вышеприведенному дизайну, без сериализации оригинала.

редактировать

Вот образец Ани, отформатированный, с одним изменением:

[XmlIgnore]
public string Password { get; set; }

[XmlElement("Password")]
public string SerializablePassword
{
  get { return null; }
  set { Password = value; }
}
1 голос
/ 10 августа 2010

Если вам нравится полный контроль над процессом сериализации, вы можете реализовать интерфейс ISerializable .

Также реализовать специальный конструктор.

РЕДАКТИРОВАТЬ: Я имел в виду IXmlSerializable .Спасибо Джон.

0 голосов
/ 10 августа 2010

Хорошо, я попробовал предложение return null;, но оно не работает; он не может десериализоваться. Однако вот обходной путь:

public List<Program> Programs
{
    get
    {
        System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true);
        for (int i = 0; i < stackTrace.FrameCount; i++)
        {
            if ("XmlSerializationWriterApplication".Equals(stackTrace.GetFrame(i).GetMethod().ReflectedType.Name))
            {
                return null;
            }
        }
        return programs;
    }
    set { programs = value; }
}

Хотя, вероятно, не очень производительный, он проверяет StackTrace, чтобы увидеть, кто вызвал get - и если это Сериализатор / Writer, он ничего не возвращает.

...