Вопрос: как сериализовать объект System.Type с помощью XmlSerializer?


Рассмотрим этот тип:

  [DataContract]
  public class EntityId
  {
    [DataMember(Order = 1)]
    public string IdAsString { get; set; }
    [DataMember(Order = 2)]
    public Type Type { get; set; }
  }

Я создал для него сериализатор Xml. Однако, пытаясь сериализовать это, вы получаете исключение:

System.InvalidOperationException occurred
  Message=The type NC.DTO.FlowFolder was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
  Source=NC.DTO.XmlSerializers
  StackTrace:
       at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_Type(String n, String ns, Type o, Boolean isNullable, Boolean needType)
  InnerException: 

где NC.DTO.FlowFolder  на самом деле является строковым представлением typeof(NC.DTO.FlowFolder) - тип NC.DTO.FlowFolder как известно, сериализатору Xml, то, что, похоже, не Type сам объект.

Отражатель обнаруживает недостающее содержание метода:

private void Write3_Type(string n, string ns, Type o, bool isNullable, bool needType)
{
    if (o == null)
    {
        if (isNullable)
        {
            base.WriteNullTagLiteral(n, ns);
        }
    }
    else if (!needType && (o.GetType() != typeof(Type)))
    {
        throw base.CreateUnknownTypeException(o);
    }
}

Обратите внимание на throw заявление.

Трассировка стека:

NC.DTO.XmlSerializers.dll!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_Type(string n, string ns, System.Type o, bool isNullable, bool needType) + 0xda bytes    
NC.DTO.XmlSerializers.dll!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write11_EntityId(string n, string ns, NC.DTO.EntityId o, bool isNullable, bool needType) + 0x2a8 bytes  
NC.DTO.XmlSerializers.dll!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write14_FlowFolder(string n, string ns, NC.DTO.FlowFolder o, bool isNullable, bool needType) + 0x36b bytes  
NC.DTO.XmlSerializers.dll!Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write42_FlowFolder(object o) + 0xc9 bytes   
[Native to Managed Transition]  
System.Xml.dll!System.Xml.Serialization.TempAssembly.InvokeWriter(System.Xml.Serialization.XmlMapping mapping, System.Xml.XmlWriter xmlWriter, object o, System.Xml.Serialization.XmlSerializerNamespaces namespaces, string encodingStyle, string id) Line 342 + 0xb9 bytes    C#
System.Xml.dll!System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter xmlWriter, object o, System.Xml.Serialization.XmlSerializerNamespaces namespaces, string encodingStyle, string id) Line 676 + 0xdf bytes   C#
System.Xml.dll!System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter xmlWriter, object o, System.Xml.Serialization.XmlSerializerNamespaces namespaces, string encodingStyle) Line 646   C#
System.Xml.dll!System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter xmlWriter, object o, System.Xml.Serialization.XmlSerializerNamespaces namespaces) Line 640 C#
System.Xml.dll!System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter xmlWriter, object o) Line 616  C#

Мой вопрос: как я могу сделать сериализатор Xml счастливым для сериализации и десериализации EntityId объекты?

Благодарю.

Постскриптум

Если кто-то знает альтернативную библиотеку сериализации Xml, то это будет связано с сериализацией XML как Newtonsoft.Json для сериализации JSON - пожалуйста, пожалуйста, поделитесь.


4


источник


Ответы:


Обычно xml предназначен для независимой от платформы, поэтому почему это не работает. Вы можете попробовать:

[XmlIgnore]
public Type Type { get; set; }
[XmlElement("Type")]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public string AssemblyQualifiedTypeName
{
    get { return Type == null ? null : Type.AssemblyQualifiedName; }
    set { Type = string.IsNullOrEmpty(value) ? null : Type.GetType(value); }
}

Также обратите внимание, что атрибуты данных-контракта не действуют, если вы используете XmlSerializer, Также обратите внимание, что это привяжет вас к .NET и, возможно, к конкретным версиям и т. Д.


5