【发布时间】:2014-09-15 11:49:45
【问题描述】:
我在 F# 中有以下枚举
type MyEnum =
| Value1
| Value2
| Value3
这是代码编译时编译器生成的内容
[Serializable]
[DebuggerDisplay("{__DebugDisplay(),nq}")]
public class MyEnum : IEquatable<MyEnum>, IStructuralEquatable, IComparable<MyEnum>, IComparable, IStructuralComparable
{
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public bool IsValue1 { get; }
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public bool IsValue2 { get; }
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public bool IsValue3 { get; }
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public int Tag { get; }
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public static MyEnum Value1 { get; }
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public static MyEnum Value2 { get; }
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public static MyEnum Value3 { get; }
[CompilerGenerated]
public override sealed int CompareTo(MyEnum obj);
[CompilerGenerated]
public override sealed int CompareTo(object obj);
[CompilerGenerated]
public override sealed int CompareTo(object obj, IComparer comp);
[CompilerGenerated]
public override sealed bool Equals(MyEnum obj);
[CompilerGenerated]
public override sealed bool Equals(object obj);
[CompilerGenerated]
public override sealed bool Equals(object obj, IEqualityComparer comp);
[CompilerGenerated]
public override sealed int GetHashCode();
[CompilerGenerated]
public override sealed int GetHashCode(IEqualityComparer comp);
public static class Tags
{
public const int Value1 = 0;
public const int Value2 = 1;
public const int Value3 = 2;
}
}
问题
当上述枚举类型用于需要非静态set 的每个属性进行反序列化的序列化时,它会失败。事实上,我已经将它与RavenDB 和Json.Net 序列化一起使用,我得到以下内容
myenummember = {}
如何通过序列化程序有效地使用 F# 枚举类型?
【问题讨论】:
-
这是联合类型,而不是枚举。以下是一个枚举:
type MyEnum = Value1 = 0 | Value2 = 1 | Value3 = 2 -
如果你正在尝试序列化一个 DU(示例实际上是什么),我们最近在这里遇到了一个非常相似的问题:stackoverflow.com/questions/24884814/…
-
ildjarn 所说的。在 F# 中,.NET enum types 与 discriminated union types 完全不同,尽管它们在语法上看起来非常相似。枚举只是标准的 .NET 枚举,并且与任何能够理解它们的序列化程序兼容。另一方面,DU 在内部由具有嵌套类的类表示,并且需要序列化程序的特殊支持。这是一个 good post 解释了差异。
-
什么 json.net 版本? 6.0.(3?) 增加了支持(但有弱点,见我的回答)。顺便说一句,如果您打算将我们的编译输出大量转储,那么您真的应该在代码方面展示您正在做的事情,有用且所有这些都是
标签: serialization f# json.net ravendb