0

我想反序列化我的“DataStore”以获取类型列表。首先,我想用 XMLSerializer 在 XMl 中制作这些,但似乎他不喜欢接口、抽象类和类型......但没有解决方法,所以我需要将我的主要内容存储在 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()); 
        }
    }
}

并将我的类型存储在一个简单的类中:

[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) ;
        }
    }

远征:

     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 ...

感谢文森的帮助 :-)

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 回答