2009-12-24 6 views
0

json을 사용하여 C#에서 일련 화하려는 일부 값이있는 f # 라이브러리가 있습니다. 레지스터를 사용하면 문제가 없었지만 대수 데이터 형식을 serialize하려고하면 오류가 발생합니다.f # 대수 데이터 형식을 serialize하십시오.

예를 들어, 이것이 f # 모듈이고 t1을 직렬화하려고한다고 가정 해 보겠습니다. C#에서

module Module1= 

    type Tree = Leaf | Branch of Tree * int * Tree 

    let t1 = Leaf 

나는 다음을 수행 :이 오류에 봉착

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Module1.Tree)); 
StreamWriter writer = new StreamWriter(@"c:\test"); 
serializer.WriteObject(writer.BaseStream, Module1.t1); 
writer.Close(); 

(스페인어를 내 비주얼 스튜디오 스페인어 없기 때문에 : S)

"아니오 자체 기다리다 엘 억센 'ns.Module1 + Tree + _Leaf'는 'Module1.Tree._Leaf : http://schemas.datacontract.org/2004/07/ns'의 콘텍스트와 관련이 있습니다.이 사이트의 정보는 다음과 같습니다 : KnownTypeAttribute of Agregándolos a la DataContractSerializer와 함께 제공되는 팁). "

내 번역 : 는 "유형 'ns.Module1 + 나무 + _Leaf'는 데이터 계약 이름 'Module1.Tree._Leaf : http://schemas.datacontract.org/2004/07/ns'예상되지 않았습니다. (알려진 형식 목록에 정적으로 알 수없는 유형을 추가 예를 들어 KnownTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달되는 알려진 형식 목록에 추가 할 수 있습니다. "

어떻게 해결할 수 있습니까?

답변

3

문제는 CLR 관점에서 t1이 참조하는 개체는 실제로 Module1.Tree 유형이 아니며 관계가없는 중첩 형식 인 Module1.Tree+_Leaf입니다. DataContractJsonSerializer에게이 유형의 개체가 발생할 수 있음을 알릴 필요가 있습니다. F # 런타임에는 컴파일러에서 생성 된 중첩 형식을 나열하는 도우미 메서드가 있기를 바랍니다. 그렇지 않다면 리플렉션을 사용해야합니다.

var serializer = new DataContractJsonSerializer (
    new List<Type> (typeof (Module1.Tree).GetNestedTypes()) { // nested types 
        typeof (Module1.Tree),      // root type 
    }.ToArray()) ; 

비록 F #이 실제로 대수 형식에서 CLR 형식을 생성하는 방법을 정확하게 지정하지 않으면 이러한 코드를 작성하는 데 무서워 할지라도 말입니다.

+0

감사합니다. 그 특별한 오류를 해결하는 데 도움이되었습니다. 이제 새로운 것이 있습니다 : P – hiena

+2

또는 힌트가있는 오류 메시지처럼'[]'속성을'Tree'에 적용 할 수 있습니다. –