2012-07-26 64 views
1


我的XML序列化程序有一個奇怪的行爲。
讀取XML並將其反序列化爲對象後,所有屬性都設置爲默認值,而不是xml文件中聲明的值。
序列化程序不會引發異常並正常運行。 xml文件格式正確,適合類結構。
任何人的想法如何,或我如何能找到問題的根源?
謝謝XML反序列化:對象具有默認值

編輯: 我沒有告訴你整個故事。事情是,我得到的XML是來自另一個組件。我能夠反序列化XML文件,現在我得到了不同的格式。由於該文件有大約3000行,我無法發佈整個代碼。但這裏的區別:
deserializable:

<?xml version="1.0" encoding="utf-8"?>
<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3">
<Prop1 xmlns="">6</Prop1>
<Prop2 xmlns="">string</Prop2>
</rootElem>

不deserializable

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3">
<Prop1>6</Prop1>
<Prop2>string</Prop2>
</rootElem>

我真的不明白,爲什麼我可以解編第一個例子,由於XMLNS標籤內每個元素,爲什麼我不能解組第二個...

EDIT2:剛剛意識到這只是頂級元素有這些奇怪的xmlns = 「」 屬性。但是C#類聲明與其他所有類沒有什麼不同......這很奇怪。

的C#類是這樣的:

using namespace1; 

namespace namespace3 
{ 
    [System.SerializableAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="namespace3")] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace="namespace3", IsNullable=true)] 
    public partial class rootElem: BaseObject 
    { 
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
    public int Prop1 
    { 
     //... 
    } 
    } 
} 
+0

您需要提供更多的信息,最好是相關代碼段與你正在反序列化。 – ipavlic 2012-07-26 07:08:36

+0

@ipavlic更新了問題並添加了一個示例 – derape 2012-07-26 07:28:06

回答

1

一個具體的例子(包括C#廣告XML)將何去何從很長的路要走。最有可能的一個:

  • 名字都沒有的XML和C#之間的確切(區分大小寫)匹配
  • 有XML屬性之間的mixup(通過屬性等,允許名稱覆蓋)/元素
  • 沒有在XML命名空間(通常存在於XML和失蹤的C#)的差異

隨着你的編輯,它變得更清晰。 Xml命名空間爲非常有效; <foo xmlns="abc"/><foo/>是完全無關的。此外,XML命名空間是繼承,所以在:

<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3"> 
<Prop1>6</Prop1> 
<Prop2>string</Prop2> 
</rootElem> 

它是Prop1Prop2都在namespace3命名空間,他們從他們的父母繼承的情況。爲了使這是絕對清楚的是,你想那些要在孩子命名空間(而不是空的命名空間)的C#,告訴它

[Serializable] 
[DesignerCategory("code")] 
[XmlType(Namespace = Namespace3)] 
[XmlRoot(Namespace = Namespace3, IsNullable = true)] 
public partial class rootElem 
{ 
    private const string Namespace3 = "namespace3"; // to avoid repetition 

    [XmlElement(Namespace = Namespace3)] 
    public int Prop1 { get; set; } 
} 
+0

感謝提示。我更新了我的問題,所以我想它與xml語法有關,因爲c#類和模式已經被更改... – derape 2012-07-26 07:50:39

+1

@derape這實際上是第3個項目符號;將編輯添加更多 – 2012-07-26 07:58:37

+0

你認爲這是問題,我將不得不明確聲明它?因爲這些類是從XSD生成的,所以我需要修改代... – derape 2012-07-26 08:17:57

0

經過進一步調查,我能夠發現問題。我仍然不明白爲什麼序列化器的行爲方式如此。 據我瞭解命名空間的decleration你必須定義「xmlns」屬性沒有前綴設置默認命名空間(W3Schools)。正如我的問題說,它被定義(除了其他命名空間):

<rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns="namespace3"> 

因爲根元素的所有直接孩子們xmlns屬性(再次)宣佈,我的解釋是,默認的命名空間不能找到。
所以我所做的就是要明確地定義一個命名空間的根元素,這樣的根元素是這樣產生的:

<root:rootElem xmlns:cfg="namespace1" xmlns:office="namespace2" xmlns:root="namespace3"> 

瞧,是正確生成的XML(從直接移除xmlns屬性兒童)和串行器能夠讀取數據。
但還是有些問題依然存在:

  • 爲什麼串行無法正常使用默認的 命名空間生成XML?
  • 我期望的異常,如果串行無法讀取數據,並把它放到我的實例(爲什麼要創建一個「空」的情況下)