I have the following simple XML serializable type:
[XmlType] public class TestType { public System.Net.SecurityProtocolType ProtocolType { get; set; } } var instanceToSerialize = new TestType { ProtocolType = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 };
I can serialize an instance of this object on a computer and several computers. But on one of the computers that I tested, I get the following exception:
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)
I compared the generated sgen.exe code for operation and crashes. In the working case, I have this code:
string Write1_SecurityProtocolType(global::System.Net.SecurityProtocolType v) { string s = null; switch (v) { case global:: System.Net.SecurityProtocolType.@Ssl3 : s = @"Ssl3"; break; case global:: System.Net.SecurityProtocolType.@Tls : s = @"Tls"; break; case global:: System.Net.SecurityProtocolType.@Tls11 : s = @"Tls11"; break; case global:: System.Net.SecurityProtocolType.@Tls12 : s = @"Tls12"; break; default: s = FromEnum(((System.Int64)v), new string[] {@"Ssl3", @"Tls", @"Tls11", @"Tls12"}, new System.Int64[] {(long)global:: System.Net.SecurityProtocolType.@Ssl3 , (long)global:: System.Net.SecurityProtocolType.@Tls , (long)global:: System.Net.SecurityProtocolType.@Tls11 , (long)global:: System.Net.SecurityProtocolType.@Tls12 }, @"System.Net.SecurityProtocolType"); break; } return s; }
While on failure codes, this is the generated code:
string Write1_SecurityProtocolType(global::System.Net.SecurityProtocolType v) { string s = null; switch (v) { case global:: System.Net.SecurityProtocolType.@Tls : s = @"Tls"; break; case global:: System.Net.SecurityProtocolType.@Tls11 : s = @"Tls11"; break; case global:: System.Net.SecurityProtocolType.@Tls12 : s = @"Tls12"; break; default: s = FromEnum(((System.Int64)v), new string[] {@"Tls", @"Tls11", @"Tls12"}, new System.Int64[] {(long)global:: System.Net.SecurityProtocolType.@Tls , (long)global:: System.Net.SecurityProtocolType.@Tls11 , (long)global:: System.Net.SecurityProtocolType.@Tls12 }, @"System.Net.SecurityProtocolType"); break; } return s; }
You may notice that the code for the Ssl3 enum element is not generated in the event of a failure. You do not know why this code is missing?