Невозможность десериализации xml в Struct, который был создан ранее путем сериализации объекта Класс ранее.
Структура и класс определены с одинаковыми полями и украшены атрибутами DataMember.
Это XML, генерируемый при сериализации класса на сервере:
<?xml version = "1.0"?>
<CacheItem xmlns = "http://schemas.datacontract.org/2004/07/Contracts" xmlns:i = "http://www.w3.org/2001/XMLSchema-instance">
<ProfileID>2</ProfileID>
<CategoryID>3</CategoryID>
<ID>1</ID>
<SeverityID>4</SeverityID>
</CacheItem>
Это определение Struct:
[DataContract]
public struct CacheItem {
[DataMember(Name = "ID")] public long ID;
[DataMember(Name = "ProfileID")] public long ProfileID;
[DataMember(Name = "CategoryID")] public int CategoryID;
[DataMember(Name = "ServerityID")] public short SeverityID;
}
Это код, который пытается десериализовать этот XML в структуру:
var dcs = new DataContractSerializer(typeof(CacheItem));
using(StreamReader sr = new StreamReader("OutputSerialization.txt", false)) {
using(XmlDictionaryReader xdw = XmlDictionaryReader.CreateTextReader(sr.BaseStream, new XmlDictionaryReaderQuotas())) {
CacheItem p = (CacheItem) dcs.ReadObject(xdw);
}
}
Десериализованный экземпляр содержит правильное значение поля ProfileID, равное 2, и 0 для других примитивных полей (вероятно, потому что 0 является значением по умолчанию).
При изменении порядка полей в XML и последующей десериализации в Struct экземпляр Struct имеет разные поля, загруженные с правильными значениями.
Похоже на десериализацию в Struct, DataContractSerializer ведет себя по-другому, поскольку, если я меняю тип CacheItem на Class, он работает отлично.
Примечание. Фактическая проблема была обнаружена в нашем общении клиент-сервер, в котором мы используем WCF. Приведенный выше код написан после того, как я изолировал проблему.
Большое спасибо @dbc, это объясняет.





DataContractSerializerчувствителен к порядку, см. WCF Datacontract, некоторые поля не десериализуются, Порядок элементов данных и десериализация XML и Десериализация XML игнорирует свойства вне алфавитного порядка. Похоже, что порядок элементов в вашем XML отличается от ожидаемого. Возможно, вам нужно вручную установить порядок члена данных?