Сериализация C # "Enum" - десериализация в статический экземпляр - PullRequest
4 голосов
/ 11 марта 2010

Предположим, у вас есть следующий класс:

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» напрямую связан с их данными.

Как можно поступить об этом?

Ответы [ 2 ]

5 голосов
/ 11 марта 2010

Если вам нужно больше данных с помощью Enums, рассмотрите возможность использования атрибутов. Пример ниже.

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,
}

Возможно, это позволит вам предоставить больше информации с помощью Enums. Вы можете получить доступ к атрибутам через отражение. Если вам нужен пример для извлечения атрибута, я также могу предоставить это, но я пытаюсь сделать это несколько коротким.

0 голосов
/ 11 марта 2010

Использовать Enum.Parse ... Предположим, у вас есть следующее:

Enum myEnum{
   Foo = 1,
   Bar = 2,
   Baz = 3
};

Тогда

   myEnum myE = myEnum.Foo; /* Default! */
   myE = (myEnum)Enum.Parse(myE.GetType(), "Baz"); 
   /* Now, myE should be Baz! */
   Console.WriteLine("Enum Selected: {0}", myE.ToString());

Приведенный выше пример служит для иллюстрации того, как преобразовать строковый литерал в перечисление. Я надеюсь, что это то, что вы ищете.

...