Сериализация простого массива с помощью XmlSerializer - PullRequest
1 голос
/ 01 августа 2011

Поздно и вполне возможно, что я упускаю что-то очевидное, но что это?

Я пытаюсь создать свойство поддержки, которое показывает массив 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);

1 Ответ

2 голосов
/ 01 августа 2011

Вы не перемотали поток;он расположен в конце.Установите .Position = 0 перед прочтением.Или проще: просто сериализовать в StringWriter или, если вы действительно хотите использовать MemoryStream, передать (увеличенный) резервный массив из GetBuffer() вместе с .Length в Encoding и позвоните 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 может показаться намного проще (если вы хотите текст).

...