0

「データストア」を逆シリアル化して、Typのリストを取得したいと思います。まず、XMLSerializerを使用してXMlでこれらを作成したいのですが、彼はインターフェイス、抽象クラス、およびTypsが好きではないようです...しかし回避策がないため、メインコンテンツをXMLクラスに保存する必要があります。

public class InstalledObjects
{
    private InstalledObjects()
    {

    }

    static InstalledObjects _instance = new InstalledObjects();

    ObservableCollection<AbstrICTSUseObject> _installedObects = new ObservableCollection<AbstrICTSUseObject>();        

    public static InstalledObjects Instance
    {
        get { return _instance; }
        set { _instance = value; }
    }

    public ObservableCollection<AbstrICTSUseObject> InstalledObects
    {
        get { return _installedObects; }
        set { _installedObects = value; }
    }

    public void Saves()
    {
        List<Type> types = new List<Type>();

        foreach (var item in InstalledObects)
        {
            types.Add( item.GetType() );
        }

        TypeStore ts = new TypeStore();
        ts.Typen = types;
        ts.SaveAsBinary("TypeStore.xml");
        this.SaveAsXML("LocalDataStore.xml", types.ToArray());
    }

    public void Load()
    {
        if (File.Exists("LocalDataStore.xml"))
        {
            TypeStore ts = new TypeStore();
            ts.LoadFromBinary("LocalDataStore.xml");
            this.LoadFromXML("LocalDataStore.xml",ts.Typen.ToArray()); 
        }
    }
}

そして、私のTypsをSimpleクラスに保存します。

[Serializable]
public class TypeStore
{
    List<Type> _typen = new List<Type>();

    public List<Type> Typen
    {
        get { return _typen; }
        set { _typen = value; }
    }
}

すべてを保存する限り、これは機能すると思います。「LoadFromBinary」がいくつかのエクスペションをスローするという小さな問題がなければ、これも機能すると思います-.-

    public static void SaveAsBinary(this Object A, string FileName)
    {
        FileStream fs = new FileStream(FileName, FileMode.Create);
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(fs, A);
    }

    public static void LoadFromBinary(this Object A, string FileName) 
    {
        if (File.Exists(FileName))
        {
            Stream fs = new FileStream(FileName, FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            A = formatter.Deserialize(fs) ;
        }
    }

Expeption:

     The input stream is not a valid binary format. The starting contents (in bytes) are: 3C-3F-78-6D-6C-20-76-65-72-73-69-6F-6E-3D-22-31-2E ...

助けのためのThxベンソン:-)

4

1 に答える 1

1

これは、間違ったファイルから読み取っているという事実と同じくらい簡単ですか?

ノート:

ts.SaveAsBinary("TypeStore.xml");
this.SaveAsXML("LocalDataStore.xml", types.ToArray());

それで:

ts.LoadFromBinary("LocalDataStore.xml");
this.LoadFromXML("LocalDataStore.xml", ts.Typen.ToArray());

する必要があります:

ts.LoadFromBinary("TypeStore.xml");
this.LoadFromXML("LocalDataStore.xml", ts.Typen.ToArray());

ただし、これを.xmlと呼ぶと誤解を招くことに注意してください。また、バージョン管理に注意してください-BinaryFormatterそれは本当の豚です。個人的には、各タイプを手動でシリアル化するだけAssemblyQualifiedNameです。これは通常のxmlで実行できます。

于 2012-11-05T12:57:47.687 に答える