2011-10-29 40 views
1

我正面臨一個令人討厭的情況,我的序列化/反序列化不像預期的那樣。C#對象<->數據合同序列化/反序列化添加了一些不需要的標記

我想

<OuterClass> 
    <Assets> 
     <Asset>Asset_A</Asset> 
     <Asset>Asset_B</Asset> 
    </Assets> 
    ... 
</OuterClass> 

,但我發現

<OuterClass> 
    <Assets> 
    <Asset> 
     <Asset>Asset_A</Asset> 
    </Asset> 
    <Asset> 
     <Asset>Asset_B</Asset> 
    </Asset> 
    </Assets> 
    ... 
</OuterClass> 

正如你所看到的資產標籤來兩次。

的代碼這樣做是..

public class OuterClass 
{ 
    [DataMember(Name = "Assets", Order = 10)] 
    public List<AssetClass> Assets { get; set; } 
    ... 
    [DataContract(Name = "Asset", Namespace = "")] 
    public class AssetClass 
    { 
     [DataMember(Name = "Asset", Order = 10)] 
     public string Asset { get; set; } 
     ... 
    } 
} 

我知道我已經列出「NAME =‘資產’」中的代碼兩次過,但如果我拿出其中一方,框架增加了它的裏面的自己的名字仍然搞砸了。不知何故,我懷疑我需要改變代碼本身的結構,但不知道如何做到這一點。

(編輯) 我正在使用in-framework序列化/反序列化助手。造成這種情況的代碼(簡化):

public string ToXmlString(OuterClass AssetsWrapper) 
{ 
    DataContractSerializer ser = new DataContractSerializer(typeof(OuterClass));    
    MemoryStream memStream = new MemoryStream(); 

    // Convert object -> stream -> byte[] -> string (whew!) 
    ser.WriteObject(memStream, AssetsWrapper); 
    byte[] AssetsWrapperByte = memStream.ToArray(); 
    return Encoding.UTF8.GetString(AssetsWrapperByte); 
} 
+0

你有沒有考慮使用二進制序列化?另外,我認爲它被序列化爲一個子節點,因爲它是一個嵌套類。 – Zhanger

+0

您的DataContract和DataMember是相同的 – DeveloperX

+0

請顯示您用於序列化的代碼。 –

回答

0

好的,所以我能夠通過修改這兩個類標記以及實際的序列化/反序列化代碼來解決這個.NET序列化的怪異問題。儘管答案沒有起作用,但感謝托馬斯和穆尼姆提供的暗示讓我在經過一番實驗後走上了正確的道路。

系列化改變

與XmlSerializer的替換DataContractSerializer的。這完全吸吮,因爲它是一個很慢(500%)較慢:(...(performance here

public string ToXmlString(OuterClass AssetsWrapper) 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(OuterClass));    
    MemoryStream memStream = new MemoryStream(); 

    // Convert object -> stream -> byte[] -> string (whew!) 
    ser.WriteObject(memStream, AssetsWrapper); 
    byte[] AssetsWrapperByte = memStream.ToArray(); 
    return Encoding.UTF8.GetString(AssetsWrapperByte); 
} 

類的標記改變

public class OuterClass 
{ 
    [DataMember(Name = "Assets", Order = 10)] 
    public ListAssetClass Assets { get; set; } 
    ... 

    //[DataContract(Name = "Asset123", Namespace = "")] 
    public class ListAssetClass 
    { 
     [XmlElement(ElementName = "Asset")] 
     public List<string> Assets { get; set; } 
     ... 
    } 
} 

現在給我

<Assets> 
    <Asset>Asset One</Asset> 
    <Asset>Asset Two</Asset> 
</Assets> 

我很驚訝的是,框架序列化/反序列化是如此扭曲和緩慢的。我可能需要在某個時間尋找外部庫。

+0

XmlSerializer是古老的。您應該嘗試使數據協定序列化爲您工作,否則只需使用LINQ to XML。 –

1

所以你看到的是在OuterClass,然後corrosponds您AssetClass 那麼每個列表,最後每個AssetClass.Asset屬性是序列化到另一個標籤。

如果你自己沒有實現序列化(通過ISerialize,我相信),你不能獲得你想要的XML輸出。

1

您需要更改List<AssetClass> Assets { get; set; }List<string> Assets { get; set; }並給子元素的名稱與XmlElement屬性,讓你的類中的一些變化:

public class OuterClass 
{ 
    [DataMember(Name = "Assets", Order = 10), 
    XmlElement(ElementName = "Asset")] 
    public List<string> Assets { get; set; } 
    ... 
    //[DataContract(Name = "Asset", Namespace = "")] 
    //public class AssetClass 
    //{ 
    // [DataMember(Name = "Asset", Order = 10)] 
    // public string Asset { get; set; } 
    // ... 
    //} 
} 

希望這有助於!

+0

Munim,與我得到 <資產的xmlns:A = 「http://schemas.microsoft.com/2003/10/Serialization/Arrays」> 資產之一 資產兩 我也更新了我原來的職位與序列/反序列化片段。任何想法?謝謝! – DeepSpace101

+0

此外,如果我從DataContractSerializer切換到XmlSerializer,具有完全相同的數據合同,我現在得到 資產一 資產兩 標記之間的標籤現在下落不明!這是越來越有趣... – DeepSpace101

1

您可以使用XmlSerializer而不是DataContractSerializer,這將使您更有效地控制您的XML

+0

我與Munim的建議(下)一起做了。隨着我從重複標籤去單個標籤 - 但我的外標籤丟失。希望有什麼想法... – DeepSpace101

相關問題