2011-08-01 26 views
1

其遲到和完全可能我錯過了一些明顯的東西,但它是什麼?用XmlSerializer序列化一個簡單的數組

我想創建一個支持屬性,它揭示了一個int數組作爲序列化(然後用於建立一個隊列)。

我敢肯定,這是對的,但吸氣總是返回一個空字符串,即使存在在那裏的值(而不是它應該永遠返回一個空字符串

這裏是我的代碼:

readonly Lazy<XmlSerializer> _queueSerializer = new Lazy<XmlSerializer>(() => new XmlSerializer(typeof(int[]))); 
[StringLength(1000)] 
public string _MostRecentPlayers 
{ 
    get 
    { 
     var stream = new MemoryStream(); 
     _queueSerializer.Value.Serialize(stream, _mostRecentPlayers.ToArray()); 
     return new StreamReader(stream).ReadToEnd(); 
    } 
    set 
    { 
     if (value.IsEmpty()) 
     { 
      _mostRecentPlayers.Clear(); 
      return; 
     } 
     MemoryStream stream = new MemoryStream(Encoding.ASCII.GetBytes(value)); 
     var tempQueue = _queueSerializer.Value.Deserialize(stream) as int[]; 
     _mostRecentPlayers.Clear(); 
     tempQueue.ForEach(_mostRecentPlayers.Enqueue); 
    } 
} 
readonly Queue<int> _mostRecentPlayers = new Queue<int>(_mostRecentAmountTracked); 

回答

2

您還沒有倒過流;它被定位在年底看完或更容易前設置.Position = 0,只是序列化到一個StringWriter,或者如果你真的想用一個MemoryStream,通過(過大)。來自GetBuffer()的支持陣列以及.LengthEncoding,並致電GetString()

using(var sw = new StringWriter()) { 
    _queueSerializer.Value.Serialize(sw, _mostRecentPlayers.ToArray()); 
    xml = sw.ToString(); 
} 

或ASCII(見註釋):

using(var ms = new MemoryStream()) { 
    var settings = new XmlWriterSettings { 
     Encoding = Encoding.ASCII 
    }; 
    using(var xw = XmlWriter.Create(ms, settings)) { 
     _queueSerializer.Value.Serialize(xw, _mostRecentPlayers.ToArray()); 
    } 
    xml = Encoding.ASCII.GetString(ms.GetBuffer(), 0, (int)ms.Length); 
} 

而且,除非是不可能,你將在EXE序列化,我建議簡化到只是:

static readonly XmlSerializer _queueSerializer =new XmlSerializer(typeof(int[])); 

最後,請注意,xml作爲一個機制來傳遞一些整數是非常冗長的。 CSV似乎更簡單(假設你想要文本)。

+0

我剛剛在其他地方發現了一個使用StringWriter的提示。我如何指定它使用ASCII碼? –

+0

@George - 如果它必須是ASCII,那麼首先要注意的是,你真的需要明確地調出一個XmlWriter,否則編碼是錯誤的。我會添加一個例子。 –

+1

@George看到新的編輯 –

相關問題