C# 枚举序列化失败
为此,我使用.NET3.5 我有一个枚举: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
[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有什么不同吗?