C# 对象删除后的序列化错误(NetDataContractSerializer)
我正在使用NetDataContractSerializer。我可以创建,添加和序列化对象到数据文件没有问题;将文件重新加载到GUI中没有问题 但是,当我试图从数据中删除(删除)对象并重新保存(序列化)数据时,遇到了一个问题 这是我的删除房间按钮;当用户请求删除特定楼层上的房间时,程序将创建位于该楼层上特定房间内的对象列表。然后删除它们,关闭它们正在查看的当前表单并保存数据 这似乎是可行的,因为程序不会崩溃,并且该房间将从当前楼层的房间列表中删除 但是,当我尝试重新加载文件(关闭程序、打开并加载)时,会出现以下错误: “反序列化对象时出错。根级别的数据无效。第1行,位置1。” 这是我的房间按钮C# 对象删除后的序列化错误(NetDataContractSerializer),c#,serialization,netdatacontractserializer,C#,Serialization,Netdatacontractserializer,我正在使用NetDataContractSerializer。我可以创建,添加和序列化对象到数据文件没有问题;将文件重新加载到GUI中没有问题 但是,当我试图从数据中删除(删除)对象并重新保存(序列化)数据时,遇到了一个问题 这是我的删除房间按钮;当用户请求删除特定楼层上的房间时,程序将创建位于该楼层上特定房间内的对象列表。然后删除它们,关闭它们正在查看的当前表单并保存数据 这似乎是可行的,因为程序不会崩溃,并且该房间将从当前楼层的房间列表中删除 但是,当我尝试重新加载文件(关闭程序、打开并加载
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
这是我的持久控制器
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();
}
}
我想你的问题可能是
FileMode.open或create
。创建,否则您将从原始(较长)文件中得到一个不需要的尾部
另外,在主题旁边,使用using(){}
块来处理文件流
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();
}
}