1

假设我们有 1000 个字符串或对象的列表,将其序列化到文件中,下次想要更新其中一个并再次序列化。

当前场景:序列化 1000 个项目。反序列化所有这些更新元素之一,然后再次序列化所有 1000 个元素。我们不需要保存\加载所有项目来更新一个元素,这是一种更好的方法吗?

更新

我的所有数据都在列表 itemTosave 的实例中。下面的类序列化 itemTosave。

[System.Serializable]
internal sealed class SaveAndLoadContainer : ISerializable {

private  List<SaveAndLoadItem> loadedItems;
public  static SaveAndLoadContainer  Instance_Save;
public  static SaveAndLoadContainer  Instance_Load;
private  List<SaveAndLoadItem> loadedItems;
public List<SaveAndLoadItem> LoadedItems {
    get {
        return this.loadedItems;
    }
}   

public  SaveAndLoadContainer(){
    Instance_Save = this;
}
private SaveAndLoadContainer(SerializationInfo info, StreamingContext contex){
    loadedItems = (List<SaveAndLoadItem>)info.GetValue("UnsavedItems", typeof(List<SaveAndLoadItem>));
    SaveAndLoadManager.ItemsToSave.Clear(); 
    SaveAndLoadManager.ItemsToSave.TrimExcess();)
    SaveAndLoadManager.ItemsToSave.AddRange(loadedItems);
}

public void GetObjectData (SerializationInfo info, StreamingContext context){
    List<SaveAndLoadItem> unsavedItems = SaveAndLoadManager.ItemsToSave;
    info.AddValue("UnsavedItems", unsavedItems, typeof(List<SaveAndLoadItem>));
}

}

SaveAndLoadItem 类是:

[System.Serializable]
internal sealed class SaveAndLoadItem {
public SaveAndLoadItem(){
    UniqueName = "--Nothing--";
    Value = null;
    ValueType = null;   
    IsClient = false;
}
public SaveAndLoadItem(string uniqueName, object value,Type typeOfValue,bool isClient){
    UniqueName = uniqueName;
    Value = value;
    ValueType = typeOfValue;
    IsClient = isClient;
}

public string UniqueName;
public System.Object Value;
public Type   ValueType;
public bool   IsClient;

}
4

2 回答 2

0

我的所有数据都在列表 itemTosave 的实例中。下面的类序列化 itemTosave。

[System.Serializable]
internal sealed class SaveAndLoadContainer : ISerializable {

private  List<SaveAndLoadItem> loadedItems;
public  static SaveAndLoadContainer  Instance_Save;
public  static SaveAndLoadContainer  Instance_Load;
private  List<SaveAndLoadItem> loadedItems;
public List<SaveAndLoadItem> LoadedItems {
    get {
        return this.loadedItems;
    }
}   

public  SaveAndLoadContainer(){
    Instance_Save = this;
}
private SaveAndLoadContainer(SerializationInfo info, StreamingContext contex){
    loadedItems = (List<SaveAndLoadItem>)info.GetValue("UnsavedItems", typeof(List<SaveAndLoadItem>));
    SaveAndLoadManager.ItemsToSave.Clear(); 
    SaveAndLoadManager.ItemsToSave.TrimExcess();)
    SaveAndLoadManager.ItemsToSave.AddRange(loadedItems);
}

public void GetObjectData (SerializationInfo info, StreamingContext context){
    List<SaveAndLoadItem> unsavedItems = SaveAndLoadManager.ItemsToSave;
    info.AddValue("UnsavedItems", unsavedItems, typeof(List<SaveAndLoadItem>));
}

}

SaveAndLoadItem 类是:

[System.Serializable]
internal sealed class SaveAndLoadItem {
public SaveAndLoadItem(){
    UniqueName = "--Nothing--";
    Value = null;
    ValueType = null;   
    IsClient = false;
}
public SaveAndLoadItem(string uniqueName, object value,Type typeOfValue,bool isClient){
    UniqueName = uniqueName;
    Value = value;
    ValueType = typeOfValue;
    IsClient = isClient;
}

public string UniqueName;
public System.Object Value;
public Type   ValueType;
public bool   IsClient;

}

于 2012-12-06T16:00:10.193 回答
0

如果它是字符串列表,您应该只使用文本文件。

对于对象,如果与批量读/写相比,更新单个对象非常普遍,那么您应该单独序列化每个对象或使用分区方案对它们进行批处理。最佳分区方案将取决于您的用例。例如,如果是联系人列表,您可以按姓氏的第一个字母进行分区。

另一种选择是序列化单个对象并将每个对象记录在关系数据库中,例如 Sql Server。您可以使用如下表将序列化对象记录在二进制列中:

CREATE TABLE Objects
(
    Id varchar(255),
    Bytes varbinary
)

当字节 blob 的大小非常小(例如 >4KB)时,关系数据库将比文件系统执行得更好。

于 2012-12-06T07:20:27.363 回答