列出<t>序列化性能问题</t>

时间:2012-12-06 06:58:17

标签: c# serialization

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

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

更新

我的所有数据都在list,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;

}

2 个答案:

答案 0 :(得分:0)

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

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

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

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

当字节blob的大小非常小(例如> 4KB)时,关系数据库的性能将优于文件系统。

答案 1 :(得分:0)

我的所有数据都在list,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;

}