& # 39; System.NotSupportedException& # 39;内存流不可扩展

本文关键字:可扩展 System NotSupportedException 内存 | 更新日期: 2023-09-27 18:14:13

我得到错误"抛出异常:'系统。当尝试序列化和保存自定义类对象的实例时," in mscorlib.ni.dll Memory stream is not expand "。

下面是我的保存/加载方法:

    public void SerializeObject<T>(T serializableObject, string fileName)
    {
        if (serializableObject == null) { return; }
        try
        {
            XmlDocument xmlDocument = new XmlDocument();
            XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
            using (MemoryStream stream = new MemoryStream())
            {
                // convert string to stream
                byte[] byteArray = Encoding.UTF8.GetBytes(fileName);
                MemoryStream fileNameStream = new MemoryStream(byteArray);
                serializer.Serialize(stream, serializableObject);
                stream.Position = 0;
                xmlDocument.Load(stream);
                xmlDocument.Save(fileNameStream);
                stream.Dispose();
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
        Debug.WriteLine(TAG + serializableObject.ToString() + " saved");
    }

    public T DeSerializeObject<T>(string fileName)
    {
        if (string.IsNullOrEmpty(fileName)) { return default(T); }
        T objectOut = default(T);
        try
        {
            string attributeXml = string.Empty;
            // convert string to stream
            byte[] byteArray = Encoding.UTF8.GetBytes(fileName);
            MemoryStream stream = new MemoryStream(byteArray);
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(stream);
            string xmlString = xmlDocument.OuterXml;
            using (StringReader read = new StringReader(xmlString))
            {
                Type outType = typeof(T);
                XmlSerializer serializer = new XmlSerializer(outType);
                using (XmlReader reader = XmlReader.Create(read))
                {
                    objectOut = (T)serializer.Deserialize(reader);
                    reader.Dispose();
                }
                read.Dispose();
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
        if (objectOut != null) Debug.WriteLine(TAG + objectOut.ToString() + " loaded");
        return objectOut;
    }

这是我要保存的对象类

public class EntryDataType
{
    readonly string TAG = "EntryDataType: ";
    private static int idCounter = -1;
    public int id;
    private EntryDataType parentEdt;
    public EntryDataType parentEdtProperty
    {
        get { return parentEdt; }
        set { parentEdt = value; }
    }
    // row control is not serializable, so ignore it when saving
    [XmlIgnore]
    public RowControl linkedRowControl;
    public int indent = -1;
    public int index = -1;
    public int linearIndex = -1;
    private bool completed = false;
    public bool completedProperty {
        get { return completed; }
        set
        {
            // set hidden state and set all children's hidden state, i.e. they will do the same
            completed = value;
            foreach (var item in childList)
            {
                item.linkedRowControl.SetCompleted(value);
            }
        }
    }
    public ChildList<EntryDataType> childList;
    public bool bulletButtonChecked;
    public string textboxText;
    public EntryDataType()
    {
        // assign unique id to each entry
        id = idCounter;
        idCounter++;
        //Debug.WriteLine(TAG + "new entry " + id + " created");
        childList = new ChildList<EntryDataType>();
        childList.parentEdtOfChildListProperty = this;
    }
}

我已经重写了这个类,以消除它的构造函数的参数,并忽略不可序列化的RowControl成员。我只是在学习。net和c#,所以还不完全知道我在做什么;非常感谢任何帮助。谢谢:)

& # 39; System.NotSupportedException& # 39;内存流不可扩展

好的,我想我知道你想做什么-序列化和反序列化一个对象和一个文件。您的方法有点复杂,可以简化一下,例如:

public static void SerializeObject<T>(T serializableObject, string fileName)
{
    if (serializableObject == null) { return; }
    try
    {
        XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
        using (Stream stream = File.Open(fileName, FileMode.Create))
        {
            serializer.Serialize(stream, serializableObject);
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}

public static T DeSerializeObject<T>(string fileName)
{
    if (string.IsNullOrEmpty(fileName)) { return default(T); }
    try
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        using (Stream stream = File.Open(fileName, FileMode.Open))
        {
            return (T)serializer.Deserialize(stream);
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
    return default(T);
}

不需要先读写MemoryStream。您可以直接从文件进行序列化和反序列化。

同样,当使用using时,不需要释放对象(像你的stream.Dispose();行)——这就是释放的目的(如果有异常,对象也会被释放)。

我还没有尝试过你的类,但它应该工作得很好。试一试,看看是否有效。

byte[] byteArray = Encoding.UTF8.GetBytes(fileName);
MemoryStream fileNameStream = new MemoryStream();
...
xmlDocument.Save(fileNameStream);