2014-07-24 6 views
2

으로 노동 조합을 차별 I F 번호에 다음 열거가문제 Json.net

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

문제 를 컴파일 할 때 컴파일러가 생성하는 무엇인가가있을 때 위 enum 유형은 비 직렬화를 위해 각 속성에 대해 비 정적 인 set을 필요로하는 직렬화에 사용되지만 실패합니다. 사실 나는 RavenDBJson.Net 직렬화를 사용하고 난 시리얼 라이저와 F # 열거 형의

myenummember = {} 

다음 어떻게 효과적으로해야합니까 사용을 얻을?

+3

그것은 열거 형이 아니라 공용체 유형입니다. 다음은 enum입니다 :'type MyEnum = Value1 = 0 | Value2 = 1 | Value3 = 2' – ildjarn

+0

DU (예제가 실제로 무엇인지)를 직렬화하려는 경우, 우리는 최근에 이와 비슷한 질문을 최근에 받았습니다 : http://stackoverflow.com/questions/24884814/serializing-f-discriminated-unions- with-protobuf –

+2

ildjarn이 말한 것. F # [.NET enum types] (http://fsharpforfunandprofit.com/posts/enum-types/)에서 [discriminated union types]과 완전히 다른 (http://fsharpforfunandprofit.com/posts/discriminated-unions)입니다. /), 비록 그들이 매우 유사한 문법으로 보일지라도. 열거 형은 표준 .NET 열거 형이며이를 이해하는 모든 serializer와 호환됩니다. 반면에 DU는 중첩 된 클래스가있는 클래스에 의해 내부적으로 표현되며 serializer의 특별한 지원이 필요합니다. 차이점을 설명하는 [좋은 게시물] (http://ikriv.com/dev/misc/fsharp/fs_enums.html)이 있습니다. – Grundoon

답변

-2

"Serializable"속성으로 유형을 표시해보십시오. 또한 패턴 식별자에 대한 할당을 제공하면 컴파일러가 열거 형이며 유 형이 도움이되지 않는다고 추측하는 데 도움이 될 수 있습니다. Json.net 6.0 (0.1은?) F 번호의 하위 사용자에 대한 지원을 제공하지만

[<Serializable>] 
type x = 
    ABC = 1 
| ABE = 2 
+0

-1 아무런 차이가 없어야합니다. - 사용하지 않아야합니다. 그러한 맹공격과 json.net은 많은 다른 경우를 다루는데 꽤 철저합니다. (그리고 나는 그 일을해야만했던 코드를 OP에게 요청할 것이다 ...) –

2

&을 번역하는 방법을 알고있는 JsonConverter 인스턴스를 제공 할 수 있습니다.

2

은 (@John Palmer's link에 내 대답과 해설에서 언급 한 일부) 많은 약점이있다.

FsUno.Prod에는 이러한 문제를 해결하고 [@Ayende Rahien의 기술을 사용하여] Serialization.fs (Jérémie Chassaing 작성)이 포함되어 있습니다. here (바로이 순간 my fork, FunDomainincludes some further extensions에서)


. (변경 사항은 FsUno.Prod로 끝날 것입니다. FsUno.Prod는 정식 repo로 간주되어야합니다)