它已经很晚了,完全有可能我错过了一些明显的东西,但是它是什么?
我正在尝试创建一个支持属性,它将一个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);
答案 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似乎更简单(假设你想要文本)。