是否可以从c#中的int反序列化枚举.例如,如果我有以下课程:
class Employee
{
public string Name { get; set;}
public int EmployeeTypeID { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我可以轻松地从XML创建它
<Employee>
<Name>Joe Bloggs</Name>
<EmployeeTypeID>1</EmployeeTypeID>
</Employee>
Run Code Online (Sandbox Code Playgroud)
使用这样的东西:
Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader);
Run Code Online (Sandbox Code Playgroud)
由于涉及的工作非常少,这使我可以使用一个通用服务,通过将select命令,连接字符串和类型输入到并检索对象数组而无需进一步映射,我可以将其用于所有数据库对象.但是我已经忘记了枚举.假设现在而不是整数EmployeeType是一个枚举:
public enum EmployeeTypeEnum
{
Admin = 1,
Sales = 2
}
Run Code Online (Sandbox Code Playgroud)
所以我的班级成为:
class Employee
{
public string Name { get; set;}
public EmployeeTypeEnum EmployeeTypeID { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用相同的XML并使c#认识到xml中EmployeeTypeID的int值应该与enum的int值相对应吗?还有其他类似的问题,但没有一个非常令人满意的答案是相当陈旧的,并涉及批量更改代码.我希望有更好的解决方案......
作为一个可能的单独注释(并略微预期一些响应),使用枚举最好避免这种做法?我应该使用键值对吗?如果可能存在更改,我将始终使用键值对(或类似值),但在这种情况下,EmployeeType是固定的,永远不会更改.
为简单起见,我将使用水果显示我的示例代码.实际上我正在做一些更有意义的事情(我们希望).假设我们有一个枚举:
public enum FruitType
{
Apple,
Orange,
Banana
}
Run Code Online (Sandbox Code Playgroud)
一节课:
[Serializable]
public class Fruit
{
public FruitType FruitType { get; set; }
public Fruit(FruitType type)
{
this.FruitType = type;
}
}
Run Code Online (Sandbox Code Playgroud)
我们可以对它进行序列化和反序列化.现在,让我们修改枚举,现在它是:
public enum FruitType
{
GreenApple,
RedApple,
Orange,
Banana
}
Run Code Online (Sandbox Code Playgroud)
反序列化以前序列化的对象时,会出现System.InvalidOperation异常,因为Apple(原始枚举项)无效.该对象不会被反序列化.
我能够解决这个问题的一种方法是在序列化时为类中的FruitType属性赋予Fruit不同的名称,如下所示:
[XmlElement(ElementName = "Mode")]
public FruitType FruitType { get; set; }
Run Code Online (Sandbox Code Playgroud)
现在,在反序列化期间,旧属性将被忽略,因为找不到它.我想知道是否有一种方法可以在反序列化期间忽略/跳过无效的枚举项,这样就不会抛出异常并且对象仍然会被反序列化.
c# serialization xml-serialization xml-deserialization deserialization