У меня есть следующий простой XML сериализации типа:Отсутствует SecurityProtocolType.Ssl3 значение перечисления при XML сериализации
[XmlType]
public class TestType
{
public System.Net.SecurityProtocolType ProtocolType { get; set; }
}
var instanceToSerialize = new TestType { ProtocolType = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 };
Я могу сериализовать экземпляр этого объекта просто отлично на моем компьютере и несколько компьютеров. Но на одном из компьютеров я испытал, я получаю следующее исключение:
System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: Instance validation error: '4080' is not a valid value for System.Net.SecurityProtocolType.
at System.Xml.Serialization.XmlCustomFormatter.FromEnum(Int64 val, String[] vals, Int64[] ids, String typeName)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTestType.Write1_SecurityProtocolType(SecurityProtocolType v)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTestType.Write3_TestType(String n, String ns, TestType o, Boolean isNullable, Boolean needType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTestType.Write4_TestType(Object o)
Я сравнил sgen.exe
сгенерированный код для работы и отсутствия случаев. На рабочем случае у меня есть этот код, генерируемый:
string Write1_SecurityProtocolType(global::System.Net.SecurityProtocolType v) {
string s = null;
switch (v) {
case global::[email protected]: s = @"Ssl3"; break;
case global::[email protected]: s = @"Tls"; break;
case global::[email protected]: s = @"Tls11"; break;
case global::[email protected]: s = @"Tls12"; break;
default: s = FromEnum(((System.Int64)v), new string[] {@"Ssl3",
@"Tls",
@"Tls11",
@"Tls12"}, new System.Int64[] {(long)global::[email protected],
(long)global::[email protected],
(long)global::[email protected],
(long)global::[email protected]}, @"System.Net.SecurityProtocolType"); break;
}
return s;
}
В то время как на неисправном коде, это сгенерированный код:
string Write1_SecurityProtocolType(global::System.Net.SecurityProtocolType v) {
string s = null;
switch (v) {
case global::[email protected]: s = @"Tls"; break;
case global::[email protected]: s = @"Tls11"; break;
case global::[email protected]: s = @"Tls12"; break;
default: s = FromEnum(((System.Int64)v), new string[] {@"Tls",
@"Tls11",
@"Tls12"}, new System.Int64[] {(long)global::[email protected],
(long)global::[email protected],
(long)global::[email protected]}, @"System.Net.SecurityProtocolType"); break;
}
return s;
}
Вы можете заметить, что код элемента Ssl3
перечислений не генерируется неудачный случай. Вы не знаете, почему этот код отсутствует?
Проверьте версии .NET, установленные на ПК. Я считаю, что новая версия 4.6 могла удалить эту опцию. –
@Brianfromstatefarm nope, у меня установлены 4.6.1 и 4.6.2, а 4.6.x все еще имеет член перечисления Ssl3. – huseyint