NetDataContractSerializer и типы CLR
Для состояний msdn NetDataContractSerializer ниже
"NetDataContractSerializer можно использовать только в том случае, если оба конца сериализации и десериализации имеют одинаковые типы CLR".
Мое обязательство состоит в том, что, если я сериализовал файл в.net4.0, используя NetDataContractSerializer, а позже переместил весь код в.net4.5, то файл с.net 4.0 не получит десериализованный случай, хотя код такой же.
Пожалуйста, поправьте меня, если мое понимание неверно.
2 ответа
Это зависит от типов. NetDataContractSerializer
основывается на полном имени типа, возможно, с полным именем сборки. Например, этот код:
List<string> list = new List<string>();
list.Add("joe");
list.Add("sam");
NetDataContractSerializer ser = new NetDataContractSerializer();
using (FileStream stream = File.OpenWrite("test.xml"))
{
ser.Serialize(stream, list);
}
скомпилированный с использованием CLR 2 будет производить это:
<ArrayOfstring z:Id="1" z:Type="System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" z:Assembly="0" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"><_items z:Id="2" z:Size="4"><string z:Id="3">joe</string><string z:Id="4">sam</string><string i:nil="true"/><string i:nil="true"/></_items><_size>2</_size><_version>2</_version></ArrayOfstring>
и тот же скомпилированный с использованием CLR 4 произведет это:
<ArrayOfstring z:Id="1" z:Type="System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" z:Assembly="0" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"><_items z:Id="2" z:Size="4"><string z:Id="3">joe</string><string z:Id="4">sam</string><string i:nil="true"/><string i:nil="true"/></_items><_size>2</_size><_version>2</_version></ArrayOfstring>
Как видите, не совместимы, потому что они включают System.String
Сборка уточняется ФИО. Так что это будет зависеть от того, что вы делаете, но велика вероятность, что это не будет работать как есть. У меня под рукой нет 4.5, но вы можете проверить ее напрямую.
Поскольку DotNet основан на технологии COM, я считаю, что dotnet 4.0 и dotnet 4.5 совместимы в двоичном формате, что означает, что они имеют одинаковые типы CLR и будут десериализованы.
Вы можете посмотреть здесь: блог MSDN о совместимости Framework 4.5