首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象删除错误后的序列化(NetDataContractSerializer)

对象删除错误后的序列化(NetDataContractSerializer)
EN

Stack Overflow用户
提问于 2012-03-21 20:56:09
回答 1查看 267关注 0票数 1

我正在使用NetDataContractSerializer。我可以在数据文件中创建、添加和序列化对象,没有问题;将文件重新加载到GUI中没有问题。

但是,当我尝试从数据中删除(删除)对象并重新保存(序列化)数据时,我遇到了一个问题。

这是我的“删除房间”按钮;当用户请求删除特定楼层上的房间时,程序将创建一个位于该特定楼层的特定房间内的对象列表。然后删除它们,关闭正在查看的当前窗体并保存数据。

这似乎是可行的,因为程序不会崩溃,房间将从当前楼层的房间列表中删除。

但是,当我试图重新加载文件(关闭程序、打开和加载)时,我会得到以下错误:

“反序列化对象时出错。根级的数据无效。第1行,位置1。”

这是我的deleteRoom按钮

代码语言:javascript
复制
      private void btn_deleteRoom_Click(object sender, EventArgs e)
    {
        var assets = getAssetsForCurrentRoom();
        string warningMessage = "Deleting this room will delete this room and all contained assets! Are you sure you want to do this?";
        string caption = "WARNING!";
        MessageBoxButtons buttons = MessageBoxButtons.YesNo;
        DialogResult result;
        //Display the MessageBox
        result = MessageBox.Show(warningMessage, caption, buttons);
        if (result == System.Windows.Forms.DialogResult.Yes)
        {
            var itemsToRemove = new ArrayList();
            foreach (var item in currentHouse.GetAssets())
            {
                if (item.Parent.Name == currentRoom.Name)
                {
                    itemsToRemove.Add(item);
                }
            }
            foreach (var item in itemsToRemove)
            {
                currentHouse.deleteAsset((Asset)item);
            }
            currentHouse.DeleteRoom(currentRoom);
            PersistanceController.SaveHouseWithCurrentPath(currentHouse);
            this.Close();
        }
    }

下面是方法deleteAsset()的CRUD

代码语言:javascript
复制
public void deleteAsset(Asset asset)
    {
        //is null?
        if (asset == null)
        {
            throw new ArgumentNullException("asset", "Asset cannot be null.");
        }
        //is blank
        if (string.IsNullOrWhiteSpace(asset.Name))
        {
            throw new ArgumentNullException("asset", "Asset name cannot be blank | null.");
        }
        var listAsset = _assets.FirstOrDefault(existingAsset => (existingAsset.Name == asset.Name));
        if (listAsset != null)
        {
            _assets.Remove(asset);
        }
        else
        {
            throw new InvalidOperationException("Asset does not exist; thus it can not be deleted.");
        }
    }

这是我的PersistanceController

代码语言:javascript
复制
 public static class PersistanceController
{

    public static string LastLoadedPath { get; set; }

    public static House LoadHouse(string path)
    {
        NetDataContractSerializer houseDeserializer = new NetDataContractSerializer();

        FileStream houseFileStream = new FileStream(path, FileMode.Open);
        House deserialzedHouse = (House)houseDeserializer.Deserialize(houseFileStream);

        houseFileStream.Close();

        LastLoadedPath = path;

        return deserialzedHouse;
    }

    public static void SaveHouseWithCurrentPath(House house)
    {
        SaveHouse(house, LastLoadedPath);
    }

    public static void SaveHouse(House house, string path)
    {

        //save house
        NetDataContractSerializer xmlSerializer = new NetDataContractSerializer();
        Stream streamWriter = new FileStream(path, FileMode.OpenOrCreate);
        xmlSerializer.Serialize(streamWriter, house);

        streamWriter.Close();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-21 21:06:48

我想你的问题可能是FileMode.OpenOrCreate。让它只是FileMode.Create,否则你会有一个不想要的尾巴从原始(更长)文件。

另外,附带的主题是,使用using() {}块来处理FileStreams。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9812718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档