使用XmlSerializer序列化一个简单的数组

时间:2011-08-01 06:54:08

标签: c# xml-serialization xmlserializer

它已经很晚了,完全有可能我错过了一些明显的东西,但是它是什么?

我正在尝试创建一个支持属性,它将一个int数组显示为序列化(然后用于构建一个Queue)。

我很确定这是正确的,但是getter总是会返回一个空字符串,即使那里有值(不是它应该返回一个空字符串。

这是我的代码:

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);

1 个答案:

答案 0 :(得分:2)

你没有倒流;它位于最后。在阅读之前设置.Position = 0。或者更简单,只需序列化为StringWriter,或者如果您确实想要使用MemoryStream,请将GetBuffer() 中的(超大)支持数组与{{1}一起传递} .Length并致电Encoding

GetString()

或ASCII(参见评论):

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

另外,除非不太可能你将在exe中序列化,否则我建议简化为:

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);
}

最后,请注意xml是一个非常冗长的机构,可以抛出一些内容。 CSV似乎更简单(假设你想要文本)。