假设我们有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;
}
答案 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;
}