【问题标题】:C# "Enum" Serialization - Deserialization to Static InstanceC#“枚举”序列化 - 反序列化为静态实例
【发布时间】:2010-03-11 18:43:05
【问题描述】:

假设你有以下类:

class Test : ISerializable {

  public static Test Instance1 = new Test {
    Value1 = "Hello"
    ,Value2 = 86
  };
  public static Test Instance2 = new Test {
    Value1 = "World"
    ,Value2 = 26
  };

  public String Value1 { get; private set; }
  public int Value2 { get; private set; }

  public void GetObjectData(SerializationInfo info, StreamingContext context) {
    //Serialize an indicator of which instance we are - Currently 
    //I am using the FieldInfo for the static reference.
  }
}

我想知道是否可以/优雅地反序列化为类的静态实例?

由于反序列化例程(我正在使用 BinaryFormatter,尽管我想其他人会类似)寻找具有与 GetObjectData() 相同的参数列表的构造函数,因此似乎无法直接完成。 .我认为这意味着最优雅的解决方案是实际使用enum,然后提供某种翻译机制将枚举值转换为实例引用。不过,我个人喜欢“Enum”的选择与他们的数据直接相关。

如何解决这个问题?

【问题讨论】:

  • 我正在努力解决这个问题。不幸的是,没有一个答案是相关的。每个人似乎都误解了这个问题。有没有找到合理的解决办法?
  • 顺便说一句,我正在使用“符号作为可扩展枚举”(codeproject.com/KB/cs/symbol.aspx)。我试图使它们可序列化但没有取得多大成功。我在那里发布了一个问题,看看是否有人会提供帮助。
  • jpbochi - 你几乎必须做 galford13x 的属性“hack”,或者有其他方法或映射对象,并且只在存储数据时处理枚举值。我从来没有找到更好的方法。
  • 我对您的要求表示同情。我非常想念 Java 枚举中的强大功能:(

标签: c# serialization static enums


【解决方案1】:

如果您需要使用枚举的更多数据,请考虑使用属性。下面的例子。

class Name : Attribute
{
    public string Text;

    public Name(string text)
    {
        this.Text = text;
    }
}


class Description : Attribute
{
    public string Text;

    public Description(string text)
    {
        this.Text = text;
    }
}
public enum DaysOfWeek
{
    [Name("FirstDayOfWeek")]
    [Description("This is the first day of 7 days")]
    Sunday = 1,

    [Name("SecondDayOfWeek")]
    [Description("This is the second day of 7 days")]
    Monday= 2,

    [Name("FirstDayOfWeek")]
    [Description("This is the Third day of 7 days")]
    Tuesday= 3,
}

也许这将允许您通过枚举提供更多信息。您可以通过反射访问属性。如果您需要一个示例来检索属性,我也可以提供,但我试图保持简短。

【讨论】:

  • 嗯,这行得通,但它确实需要大量的反思,这并不是我想要的。但是对于一个基本的包装类,我确实认为它会非常接近......主要的尴尬是包装类和枚举之间的名称差异。
  • 我明白你的意思。我通常通过命名 Enum 并将 Enum 附加到末尾来解决此问题。枚举 = DaysOfWeekEnum 类包装器 = DaysOfWeek
  • 另一种非常方便的访问属性方法的方法是通过扩展。如果您对如何做到这一点感兴趣,请询问有关扩展的另一个问题。
【解决方案2】:

使用Enum.Parse...假设您有以下内容:

枚举我的枚举{ 富 = 1, 酒吧 = 2, 巴兹 = 3 };

然后

myEnum myE = myEnum.Foo; /* 默认! */ myE = (myEnum)Enum.Parse(myE.GetType(), "Baz"); /* 现在,myE 应该是 Baz! */ Console.WriteLine("Enum Selected: {0}", myE.ToString());

上面的示例用于说明如何将字符串文字转换为枚举。我希望这就是您正在寻找的。​​p>

【讨论】:

  • 这是一个方便的功能,但除非您可以在默认 Enum 类型中关联比名称/索引更多的数据,否则它并不是我想要的。
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 2021-11-30
  • 1970-01-01
  • 2014-08-10
  • 2019-05-31
  • 2015-07-26
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多