1

1000 個の文字列またはオブジェクトのリストがあり、それをファイルにシリアル化し、次回はそのうちの 1 つを更新して再度シリアル化したいとします。

現在のシナリオ: 1000 アイテムをシリアル化します。それらすべてを逆シリアル化し、要素の 1 つを更新してから、1000 個の要素すべてを再度シリアル化します。たった1つの要素を更新するためにすべてのアイテムを保存/ロードする必要がないというのは、これを行うためのより良い方法ですか?

アップデート

すべてのデータは、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;

}
4

2 に答える 2

0

文字列のリストの場合は、テキスト ファイルで作業する必要があります。

オブジェクトの場合、単一のオブジェクトの更新が一括読み取り/書き込みと比較して非常に一般的である場合は、各オブジェクトを個別にシリアル化するか、パーティショニング スキームを使用してバッチ処理する必要があります。最適なパーティショニング スキームは、ユース ケースによって異なります。たとえば、連絡先のリストの場合、姓の最初の文字で分割できます。

もう 1 つのオプションは、個々のオブジェクトをシリアル化し、各オブジェクトをリレーショナル データベース (Sql Server など) に記録することです。次のようなテーブルを使用して、シリアル化されたオブジェクトをバイナリ列に記録できます。

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

バイト BLOB のサイズが非常に小さい場合 (例: >4KB)、リレーショナル データベースはファイル システムよりも優れたパフォーマンスを発揮します。

于 2012-12-06T07:20:27.363 に答える
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;

}

于 2012-12-06T16:00:10.193 に答える