【问题标题】:Serialization of two Dictionaries at once同时序列化两个字典
【发布时间】:2014-03-29 19:22:14
【问题描述】:

我有两个类如下,我在两个单独的Dictionaries 中使用它们。我怎样才能Serialize这两个字典到一个文件?我的单个字典的序列化实现可以在这个链接中找到: Serialize a Dictionary<string, object>

[Serializable]
class Beam
{
    public string Name { get; set; }
    public double Width { get; set; }
}

[Serializable]
class Column
{
    public string Name { get; set; }
    public double Width { get; set; }
}

这是我的字典:

var Dic1 = new Dictionary<string, Beam>
{
    {"Beam1", new Beam{Name = "B1", Width = 10}},
    {"Beam2", new Beam{Name = "B2", Width = 5}},
};

var Dic2 = new Dictionary<string, Column>
{
    {"Column1", new Column{Name = "C1", Width = 10}},
    {"Column2", new Column{Name = "C2", Width = 5}},
};

这是我迄今为止编写的完整代码,但出现异常:

[Serializable]
public static class Building
{
    public static Dictionary<string, Beam> Beams;
    public static Dictionary<string, Column> Columns;
}

[Serializable]
public class Beam
{
    public string Name { get; set; }
}

[Serializable]
public class Column
{
    public string Name { get; set; }
}

static class Program
{
    static void Main()
    {

        Building.Beams.Add("Beam1", new Beam { Name = "B1"});
        Building.Columns.Add("Column1", new Column { Name = "C1" });

        Serialize();
    }

    static void Serialize()
    {

        var fs = new FileStream("DataFile.dat", FileMode.Create);

        var formatter = new BinaryFormatter();
        try
        {
            // I'm getting an excepting here:
            // 'Savef.Building' is a 'type' but is used like a 'variable'
            formatter.Serialize(fs, Building);
        }
        catch (SerializationException e)
        {
            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
            throw;
        }
        finally
        {
            fs.Close();
        }
    }
}

【问题讨论】:

    标签: c# serialization dictionary


    【解决方案1】:

    创建一个标有Serializable 属性的类,包含这两个字典的实例:

    [Serializable]
    public class Building
    {
        public static Building Instance = new Building();
    
        public readonly Dictionary<string, Beam> Beams = new Dictionary<string, Beam>();
        public readonly Dictionary<string, Column> Columns = new Dictionary<string, Column>();
    
        public static Dictionary<string, Beam> AllBeams
        {
            get { return Instance.Beams; }
        }
    }
    

    编辑
    用于避免异常的Singleton 模式。
    在代码的其他部分使用 Building.Instance 访问字典。
    EDIT2
    介绍了static 属性:Building.AllBeams。您可以将其用作简写。

    【讨论】:

    • 我遇到了一个异常,可能是因为我定义了一个 static 类?
    • 是的,您应该将一个实例传递给formatter.Serialize。将您的 Building 类转换为 Singleton 模式。我要更新答案。
    • 查看更新后的答案。它已经转换了。在其余代码中,只需将每次出现的Building 替换为Building.Instance
    • 感谢德米特里,这完全有效。我无法以某种方式创建static 类的实例,对吗?我希望我的主要建筑类是static。在该方法中,我将不得不调用像Building.Instance.Beams 这样的字典。我想给他们打电话Building.Beams
    • static 类不能有实例。您可以创建一个具有不同名称的static 属性,以便能够以简写形式调用Dictionary。我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多