2012-10-09 66 views
1

我們將對象序列爲xml:雙屬性將不被序列化到XML

public class Test: INotifyPropertyChanged 
    { 
     public virtual string Name {get; set;} 
     public virtual double TestScore {get; set;} 
    } 

使用下面的方法:

public static XElement ToXElement<T>(this object obj) 
{ 
    using (var memoryStream = new MemoryStream()) 
    { 
     using (TextWriter streamWriter = new StreamWriter(memoryStream)) 
     { 
      var xmlSerializer = new XmlSerializer(typeof(T)); 
      xmlSerializer.Serialize(streamWriter, obj); 
      return XElement.Parse(Encoding.UTF8.GetString(memoryStream.ToArray())); 
     } 
    } 
} 

在下面的上下文中(代碼是在64上下文中運行,一個。 net庫是從C++庫中調用的):

XDocument rootElement = ... 

Test test = new Test(); 
test.Name = "xxx"; 
test.TestScore= 1.0d; 
rootElement.Add(test.ToXElement()); 

所有類型的屬性(string,bool,long,int,us hort等)被序列化,除了雙重屬性。一旦他們手動轉換成別的東西(不是雙倍),它們就會被序列化。

XML看起來是這樣的:

<Root> 
    <Test> 
    <Name>xxx</Name> 
    </Test> 
</Root> 

有雙重原因屬性不序列化的原因嗎?

+1

你怎麼知道雙不序列化?你能提供輸出嗎? –

+0

當我運行這段代碼(除了捕獲返回的'XElement'在一個變量中,因爲我沒有'rootElement'),這個元素同時包含Name和TestScore。 –

+0

是的,這也是我期待的,不幸的是在我們的集合(項目,平臺等)中,雙重屬性沒有被序列化。 – BanditoBunny

回答

3

要定義你想要序列化的精確程度,你應該手動進行。

[XmlIgnore] 
public double Price { get;set; } 

[XmlElement("Price")] 
public string PriceString { 
    get {return Price.ToString();} 
    set {Price = double.Parse(value);} 
} 

http://bytes.com/topic/c-sharp/answers/768555-serializable-double-precision

+0

謝謝,我們也試過這個,它工作,作爲臨時解決方法,我們手動序列化對象。問題不是我們沒有得到正確的精度,而是我們根本沒有得到屬性(也許ToString()在序列化引擎內失敗)。我非常想知道這種奇怪行爲的原因。 – BanditoBunny