Optional properties when deserializing a DataContract/Serializable mish
I have an existing codebase that persists a couple of simple classes to disk via NetDataContractSerializer , but the classes are unfortunately not adorned with [DataContract] , but rather with [Serializable] . This works fine, but now I want to add a few new properties to the persisted classes, while still be able to read the files generated by the old version.
Let's say this is the class:
[Serializable]
public class Persisted
{
public int OldProperty {get;set;}
public int NewProperty {get;set;}
}
Now, when I deserialize the old files, I get an exception because they don't contain NewProperty . This makes sense. So I wanted to have NewProperty ignored, but while there's a [OptionalField] attribute to have the serializer ignore the missing field, it can't be applied to properties - only fields.
So I figured I'll use [DataContract] and [DataMember] , which also has an IsRequired property, but this changes the layout of the serialized file, and it can't read the old data files. Moreover, you can't mix [Serializable] and [DataMember] - if the serializer sees the [Serializable] attribute, it ignores the [DataMember] directives.
So, barring the option to do a one-time conversion of the old files (possible, but not my first choice), is there a way to get the NetDataContractSerializer to ignore a field in an existing XML serialized object?
The problem is that when using the Serializable attribute, what gets serialized are fields , not properties. Since you're using auto-properties, the fields are hidden and you can't add attributes to them.
The solution is simple - don't use auto-properties.
链接地址: http://www.djcxy.com/p/58572.html