簡體   English   中英

Xmlserializer沒有序列化基類成員

[英]Xmlserializer not serializing base class members

在嘗試使用XmlSerializer序列化一個類進行日志記錄時,我遇到了這個非常奇怪的問題。 該代碼由wsdl.exe工具生成。 序列化的類聲明如下:

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "xxxxx")]
public partial class InheritedRequestA : BaseRequest
{
}

同樣繼承自BaseRequest的其他類的序列化包括所有非繼承成員,但不包括BaseRequest中的所有公共成員。 BaseRequest聲明如下。

[System.Xml.Serialization.XmlIncludeAttribute(typeof(InheritedRequestA))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(InheritedRequestB))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "xxxxx")]
public partial class BaseRequest
{
//members here
}

為了將請求和響應一起序列化,我編寫了一個非常基本的Wrapper類,它只包含一個請求對象和一個響應對象。 序列化代碼:

        XmlSerializer serializer = new XmlSerializer(typeof(Wrapper));
        string serializedObject = string.Empty;
        using (MemoryStream stream = new MemoryStream())
        {
            serializer.Serialize(stream, wrapper);
            stream.Position = 0;
            using (StreamReader reader = new StreamReader(stream))
            {
                serializedObject = reader.ReadToEnd();
            }
        }

關於為什么從基類繼承的公共屬性沒有被序列化的任何想法將不勝感激。

編輯:這是包裝類。 我將它子類化為ActivatorWrapper和VersionRetrieverWrapper。

[Serializable]
[XmlInclude(typeof(Wrapper))]
[XmlInclude(typeof(ActivatorWrapper))]
[XmlInclude(typeof(VersionRetrieverWrapper))]
public class Wrapper
{
}

[Serializable]
public class VersionRetrieverWrapper : Wrapper
{
    public InheritedRequestA Request { get; set; }
    public InheritedResponseA Response { get; set; }
}

您需要確保BaseRequest的公共成員具有分配給它們的值(無論是在默認構造函數中,在聲明中,還是在服務的代碼中)。 如果沒有,XmlSerializer將忽略它們,除非它們都是可空的( int? bool?並且 XML IsNullable屬性設置為true( [XmlElement(IsNullable = true)] )。

如果請求/響應不為空,這工作正常。 這是一個工作示例應用程序:

class Program
{
    static void Main(string[] args)
    {
        var wrapper = new VersionRetrieverWrapper();
        wrapper.Request = new InheritedRequestA();
        wrapper.Request.Member = "Request";
        wrapper.Response = new InheritedResponseA();
        wrapper.Response.Member = "Response";

        Console.WriteLine(Save(wrapper));
    }

    public static string Save(Wrapper wrapper)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Wrapper));

        string serializedObject = string.Empty;
        using (MemoryStream stream = new MemoryStream())
        {
            serializer.Serialize(stream, wrapper);
            stream.Position = 0;
            using (StreamReader reader = new StreamReader(stream))
            {
                serializedObject = reader.ReadToEnd();
            }
        }
        return serializedObject;
    }
}
public partial class InheritedRequestA : BaseRequest
{
}

public partial class InheritedResponseA : BaseRequest
{
}
public partial class BaseRequest
{
    //members here
    public string Member;
}

[XmlInclude(typeof(VersionRetrieverWrapper))]
public class Wrapper
{
}

public class VersionRetrieverWrapper : Wrapper
{
    public InheritedRequestA Request { get; set; }
    public InheritedResponseA Response { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM