C# 枚举序列化失败

C# 枚举序列化失败,c#,enums,xml-serialization,C#,Enums,Xml Serialization,为此,我使用.NET3.5 我有一个枚举: [System.SerializableAttribute()] public enum MyEnum { [System.Xml.Serialization.XmlEnumAttribute("035")] Item1, Item2 } 我在类中使用此枚举: [System.SerializableAttribute()] public class Employee { public int Id { get; se

为此,我使用.NET3.5

我有一个枚举:

[System.SerializableAttribute()]
public enum MyEnum
{
    [System.Xml.Serialization.XmlEnumAttribute("035")]
    Item1,
    Item2
}
我在类中使用此枚举:

[System.SerializableAttribute()]
public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public MyEnum MyEnum { get; set; }
}
现在我想创建一个新的Eplomyee实例,通过从字符串强制转换MyEnum属性来设置它。 然后将其序列化并保存到文件中

Employee bob = new Employee() {Id = 1, Name = "Bob"};
bob.MyEnum = (MijnEnum)Enum.Parse(typeof(MyEnum), string.Format(CultureInfo.InvariantCulture, "{0}", "035"));

XmlSerializer serializer = new XmlSerializer(typeof(Employee));
FileInfo fi = new FileInfo(@"C:\myfile.xml");
using (FileStream stream = fi.OpenWrite())
{
    XmlWriterSettings xmlWriterSettings = new XmlWriterSettings { Encoding = Encoding.UTF8, OmitXmlDeclaration = true, Indent = true };
    using (XmlWriter writer = XmlWriter.Create(stream, xmlWriterSettings))
    {
        serializer.Serialize(writer, bob); // this is place where it goes wrong
    }
}
如果我调试这个,我会看到
bob.MyEnum
的值是35

当我尝试序列化时,会出现异常:

生成XML文档时出错

实例验证错误:“35”不是的有效值 WindowsFormsApplication.MyEnum


发生了什么问题以及如何解决此问题?

之所以发生这种情况,是因为,
enum
在内部存储为
int
。因此,您的语句
bob.MyEnum=(mijneum)Enum.Parse(typeof(MyEnum),string.Format(CultureInfo.InvariantCulture,“{0}”,“035”)正在运行,没有问题。如果进行调试,
bob.MyEnum
的值为
35
。当您对此进行反序列化时,反序列化程序将搜索具有int值35的匹配
enum
,该值不存在,因为您正在指定Item1和Item2。因此你会得到一个错误

这会奏效的

 bob.MyEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "35");

 public enum MyEnum {
   Item1 = 35,
   Item2
 }
理想情况下,你应该这样做

 bob.MyEnum = (MyEnum)Enum.Parse(typeof(MyEnum), "Single");

 public enum MyEnum {
   [System.Xml.Serialization.XmlEnumAttribute("Single")]
   Item1,
   Item2
 }
希望这对你有帮助

让我们开始:

[System.SerializableAttribute()] // useless, valuetype is implicitly so
public enum MyEnum
{
    [System.Xml.Serialization.XmlEnumAttribute("035")]
    Item1,
    Item2
}
现在,
XmlEnumAttribute
控制该值在XML中的序列化和反序列化方式

它与您的其余代码无关(很抱歉给你加了帽子,但似乎没有其他人明白这一点)

因此,当值
MyEnum.Item1
被序列化时,将发出“035”

现在的问题是您希望如何分配它

这很简单。就像平常一样分配。这些属性都不会改变普通代码的语义,一切都保持不变

例如:

Employee bob = new Employee() {Id = 1, Name = "Bob", MyEnum = MyEnum.Item1};
这里根本没有理由考虑
Enum.Parse
。枚举类型和值是静态已知的

如果确实要使用
Enum.Parse
,请像正常使用一样使用它,例如:

Enum.Parse(typeof(MyEnum), "Item1")

我更改了枚举解析

我使用反射将字符串解析为枚举,如本文所述:


现在它开始工作了。

你做得非常错误。特别是
Enum.Parse
。您是否尝试在Enum声明中分配:
Item1=25,
?您知道您可以使用[Serializable]而不是[System.SerializableAttribute()]?@leppie:启发我。也许这能解决我的问题。@Botz3000:是的,我知道。属性是自动生成的,因此全名…如中所示,我没有得到您的信息。我没有给出任何解决方案。我解释了为什么用户的输入是字符串。我认为你在这里的评论有点粗鲁或无礼。在我看来,你的名声并没有给你这个特权。@onof:对不起,如果我想指出这些答案的不正确性,原因很简单,比如没有阅读问题和理解问题。我现在发布了一个答案。我认为不需要它,但似乎我弄错了。虽然我有点惊讶代码片段1可以工作(你得到了你的否决票;p),但第二个代码片段仍然不工作,或者做了OP没有尝试过的任何事情。我必须将字符串解析为enum。好的,我在我的示例中硬编码了“035”。但在我的程序中,它来自一个变量。@Natrium:如果它是一个变量,就分配它吧!你正在以一种非常复杂和不必要的方式做事。@Natrium:什么不起作用?告诉我,我真的不知道你还想做什么。@Natrium:我还在等着(并且正在努力并且愿意)帮助你。请解释哪里出了问题。@leppie最后你也在做同样的事情。我认为你需要考虑一下投票结果。您只能通过两种方式解析
Enum
Enum.parse
Enum.TryParse
from string。如果还有其他方法,你可以提及。虽然我同意上面的方法应该有效,但对于一个简单的任务来说,它似乎不必要的复杂。你知道这与Enum.Parse有什么不同吗?