Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
328 views
in Technique[技术] by (71.8m points)

c# - Serialize/deserialize objects - order of fields matters?

Is it possible that DataContractSerializer wrongly deserializes an object if the fields are not in the "correct" (whatever that means) order?

The classes that I try to serialize/deserialize do not have order-attributes placed on fields/properties. Yet one of my fields always gets deserialized as null even though it has a non-null value (it actually contains a list of strings).

When I moved two XML elements in serialized file around to match the order in another XML example (for which deserialization worked without problems) everything started to work.

This makes no sense to me but maybe someone knows better. ;)

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

To be eligible for correct serialization / serialization by the DataContractSerializer, all of the following must be true.

  1. The class that must be serialized must have SerializableAttribute or DataContractAttribute set;
  2. The properties and fields of the class that must be serialized require the DataMemberAttribute set;
  3. The datatype of the serializable property or field must be serializable (i.e., have a public ctor and inherit ISerializable);
  4. The class that must be serialized must implement IExtensibleDataObject;
  5. Note: serializable fields can be either public or private.
  6. Members must be in alphabetical order or you should use the Order-property of the DataMemberAttribute.

So, the order of the declaration does matter. If members are not in alphabetical order, they are skipped. Look up this answer at StackOverflow for an example, perhaps it applies to your case.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...