XmlSerializer,生成XML文档时出错

时间:2011-11-11 06:35:12

标签: c# winforms stream xml-serialization

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

我在stared行中出错:

  

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

我做错了什么? 我的方法是将Stream转换为字节数组是否正确? [回答]

2 个答案:

答案 0 :(得分:2)

MemoryStream有一个ToArray()方法可以使用。它返回一个包含流的全部内容的字节数组。在阅读内容之前,请确保您已完成写入流。 : - )

至于错误,没有更多信息就很难回答。您是否验证过您尝试序列化的所有对象都有效?

修改

从你的评论中我想我知道问题是什么。您可以使用1024字节的固定大小定义MemoryStream。序列化对象时,生成的xml大于该对象,最终会出现错误,指出无法扩展内存流。尝试创建它而不设置明确的大小(只需使用

  

new MemoryStream()

),或设置更大的尺寸。

另外,如果您不想序列化某个属性,只需使用XmlIgnore属性对其进行标记。

答案 1 :(得分:2)

随着您的更新包含内部异常,它变得清晰:因为您使用固定大小的字节数组初始化MemoryStream,所以整个XML必须适合您的1024字节。听起来你有足够的属性来解决这个问题。

您真正意味着最多1024个字节,或者您是否打算为流设置初始大小容量。后者将是:

MemoryStream stream = new MemoryStream(1024);