У меня есть возможное решение.
public class xxx
{
private int myValue;
[XmlElement("MyProperty")]
public int MyPropertyForSerialization
{
get { return this.myValue; }
set
{
Console.WriteLine("DESERIALIZED");
this.myValue = value;
}
}
[XmlIgnore]
public int MyProperty
{
get { return this.myValue; }
set
{
Console.WriteLine("NORMAL");
this.myValue = value;
}
}
}
class Program
{
static void Main(string[] args)
{
xxx instance = new xxx();
instance.MyProperty = 100; // This should print "NORMAL"
// We serialize
var serializer = new XmlSerializer(typeof(xxx));
var memoryStream = new MemoryStream();
serializer.Serialize(memoryStream, instance);
// Let's print our XML so we understand what's going on.
memoryStream.Position = 0;
var reader = new StreamReader(memoryStream);
Console.WriteLine(reader.ReadToEnd());
// Now we deserialize
memoryStream.Position = 0;
var deserialized = serializer.Deserialize(memoryStream) as xxx; // This should print DESERIALIZED
Console.ReadLine();
}
}
Трюк использует XmlIgnore, он заставит сериализатор xml игнорировать наше свойство, затем мы используем XmlElement, чтобы переименовать свойство для сериализации с именемсвойство, которое мы хотим.
Проблема с этим методом заключается в том, что вы должны выставлять открытое свойство для сериализации, и это в некотором роде плохо, потому что он может вызываться практически всеми.К сожалению, он не будет работать, если пользователь является личным.
Он работает, не совсем чист, но поточно-ориентирован и не использует какой-либо флаг.
Другая возможность - использоватьчто-то вроде картины Memento.Используя тот же трюк, вы можете добавить свойство, называемое, например, Memento, которое возвращает другой объект, который содержит свойства, подходящие только для сериализации, это может сделать вещи немного чище.
Думаете ли вы вместо изменения подхода и использования DataContractSerializer?Он намного мощнее и производит чистый XML.Он поддерживает механизм OnDeserializationCallback.