XmlSerializer, произошла ошибка при создании документа XML - PullRequest
1 голос
/ 11 ноября 2011
        XmlSerializer formatter = new XmlSerializer(typeof(List<Objects.PIP>));

        **MemoryStream stream = new MemoryStream(new byte[1024]);**

        formatter.Serialize(stream, Repository.GlobalRepository.PIPInformation);

        byte[] bt = stream.ToArray();
        foreach (Communication.Client Client in server.ClientList)
        {
            Client.SendMessage(bt);

        }
        stream.Flush();

Я получаю сообщение об ошибке в следующей строке:

Произошла ошибка при создании документа XML.

InnerException {"Поток памяти не расширяется."}

PIP Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ObjectLibrary.Model;
using System.Xml.Serialization;

namespace PIPServer.Objects
{

[XmlRoot(Namespace = "urn:my-namespace")]
public class PIP
{
    private long pipID;

    public long PipID
    {
        get { return pipID; }
        set { pipID = value; }
    }

    private CurrencyPair currencyPair;

    public CurrencyPair CurrencyPair
    {
        get { return currencyPair; }
        set { currencyPair = value; }
    }
    ...............
 }
}

Что я делаю не так?Также мой метод для преобразования потока в байтовый массив правильный?[Ответ]

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Если в ваше обновление включено внутреннее исключение, становится ясно: поскольку вы инициализируете MemoryStream массивом байтов фиксированного размера, весь XML-файл должен умещаться в ваших 1024 байтах.Похоже, у вас достаточно свойств, чтобы создать проблему.

Вы действительно имели в виду максимум 1024 байта или намеревались установить начальный размер для потока.Последний будет:

MemoryStream stream = new MemoryStream(1024);
2 голосов
/ 11 ноября 2011

MemoryStream имеет метод ToArray(), который вы можете использовать. Возвращает байтовый массив со всем содержимым потока. Просто убедитесь, что вы закончили запись в поток, прежде чем читать содержимое. : -)

Что касается ошибки, трудно ответить без дополнительной информации. Вы убедились, что все объекты, которые вы пытаетесь сериализовать, действительны?

Edit:

Из ваших комментариев я думаю, что знаю, в чем проблема. Вы определяете MemoryStream с фиксированным размером 1024 байта. Когда вы сериализуете ваш объект, сгенерированный xml будет больше, чем это, и вы получите ошибку, говорящую, что вы не можете расширить поток памяти. Попробуйте создать его без указания явного размера (просто используйте

new MemoryStream ()

), или установите больший размер.

Кроме того, если вы не хотите сериализовать свойство, просто пометьте его атрибутом XmlIgnore.

...