XmlSerializer, произошла ошибка при генерации XML-документа

#c# #winforms #stream #xml-serialization

#c# #winforms #поток #xml-сериализация

Вопрос:

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

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

Комментарии:

1. Скорее всего, это что-то другое в вашем классе PIP. Пожалуйста, дайте нам полное определение класса

2. есть только другие свойства, ничего больше…

Ответ №1:

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

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

Редактировать:

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

новый MemoryStream()

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

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

Комментарии:

1. существует внутренний объект CurrencyPair, который мне тоже нужно сериализовать. а также я не хочу сохранять этот объект, который я могу игнорировать.

2. Внутреннее исключение {«Поток памяти не может быть расширен».}

Ответ №2:

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

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

 MemoryStream stream = new MemoryStream(1024);