首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过applicationsettingsbase重新加载不同的对象?

如何通过applicationsettingsbase重新加载不同的对象?
EN

Stack Overflow用户
提问于 2010-04-23 23:32:47
回答 2查看 308关注 0票数 0
代码语言:javascript
复制
// TestASettingsString and TestBSettingsString are byte[]
// TestASettings and TestBSettings are two objects to be saved

在SettingsSaving中,TestASettings和TestBSettings被序列化为两个独立的字节数组,然后保存(在其他函数中)

我的问题是如何在加载保存的设置中分别从TestASettingsString和TestASettingsString恢复TestASettings和TestBSettings?

这就是我做formatter.Deserialize(流)的时候;

如何将两个完全不同的对象TestASettings和TestBSettings从formatter.Deserialize(流)中分离出来?

谢谢

代码语言:javascript
复制
private void SettingsSaving(object sender, CancelEventArgs e)
    {

        try
        {
            var stream = new MemoryStream();
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, TestASettings);
    // TestASettingsString and TestBSettingsString are byte[]
            TestASettingsString = stream.ToArray();

            stream.Flush();
            formatter.Serialize(stream, TestBSettings);
            TestBSettingsString = stream.ToArray();   

            stream.Close();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
        }
    }





private void LoadSavedSettings()
    {
        Reload();
        // how to get TestASettings and TestBSettings from TestASettingsString  and
        // TestASettingsString seperately?
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-23 23:53:06

我怀疑问题的一部分在这里:

代码语言:javascript
复制
        TestASettingsString = stream.ToArray();
        stream.Flush();
        formatter.Serialize(stream, TestBSettings);
        TestBSettingsString = stream.ToArray();  

对于MemoryStream来说,Flush()是一个不可操作的东西。你的实际意思是:

代码语言:javascript
复制
        TestASettingsString = stream.ToArray();
        stream.SetLength(0);
        formatter.Serialize(stream, TestBSettings);
        TestBSettingsString = stream.ToArray();  

哪一项将重置流,将TestBSettingsString作为单独的数据块?目前,TestBSettingsString实际上同时包含TestASettingsTestBSettings

完成后,应该只是一个反转的例子:

代码语言:javascript
复制
using(MemoryStream ms = new MemoryStream(TestASettingsString)) {
    BinaryFormatter bf = new BinaryFormatter();
    TestASettings = (WhateverType)bf.Deserialize(ms);
}
using(MemoryStream ms = new MemoryStream(TestBSettingsString)) {
    BinaryFormatter bf = new BinaryFormatter();
    TestBSettings = (WhateverOtherType)bf.Deserialize(ms);
}

另请注意:我建议使用而不是使用BinaryFormatter来持久化任何离线的东西(磁盘、数据库等)。

票数 1
EN

Stack Overflow用户

发布于 2010-04-24 00:10:45

反序列化它们需要像这样的代码:

代码语言:javascript
复制
var ms = new MemoryStream(TestASettingsString);
var fmt = new BinaryFormatter();
TestASettings = (TestAClass)fmt.Deserialize(ms);

其中TestAClass是TestASettings的类型。您需要在序列化代码中重置流,将位置设置回0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2699850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档