2012-04-20 9 views
0

DataContractSerialize로 개체를 serialize하는 방법을 모르겠습니다.DataContractSerializer가 작동하지 않는 이유는 무엇입니까?

var sData = SerializerHelper.DataContractSerialize(msg); 

그것은 예외가 발생합니다 :이 같은 DataContractSerialize을 실행하면

public static string DataContractSerialize(object target) 
    { 
     var formatter = new DataContractSerializer(target.GetType()); 
     using (var stream = new MemoryStream()) 
     { 
      formatter.WriteObject(stream, target); 
      stream.Position = 0; 
      return Encoding.UTF8.GetString(stream.ToArray()); 
     } 
    } 

엔티티

[Serializable, DataContract(Namespace = "CommunicationModel.Entity")] 
[KnownType(typeof(Message))] 
[KnownType(typeof(int))] 
[KnownType(typeof(string))] 
[KnownType(typeof(Type))] 
[KnownType(typeof(object))] 
public class Message : IDisposable 
{ 
    public Message(string stringInfo) 
    { 
     MessageValue = stringInfo; 
     MessageType = typeof (string); 
    } 

    public Message(int intInfo) 
    { 
     MessageValue = intInfo; 
     MessageType = typeof (int); 
    } 
    [DataMember] 
    public Type MessageType { get; private set; } 
    [DataMember] 
    public object MessageValue { get; private set; } 

    #region Implementation of IDisposable 

    public void Dispose() 
    { 
    } 

    #endregion 
} 

: 다음은 내 코드입니다. 내가 무엇을 할 수 있을지?

+0

무슨 예외입니까? – mgnoonan

+0

KnowType이 필요합니다. 데이터 계약 이름이 'RuntimeType : http : //schemas.datacontract.org/2004/07/System'인 'System.RuntimeType'유형이 필요하지 않습니다. KnownTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달 된 알려진 형식 목록에 추가하여 알려진 형식 목록에 정적으로 알지 못하는 형식을 추가합니다. – GeminiYellow

답변

0

먼저 [Serializable] 및 [DataContract] 유형 모두를 가질 수 없습니다. 이것은 권장되지 않으며 의미가 없습니다. 그냥 [DataContract] 있습니다. 이유에 대한 자세한 내용은 this post on the data contract programming model을 참조하십시오.

어쨌든 여기서 MessageType이 RuntimeType으로 표시되기 때문에 RuntimeType을 직렬화하려고합니다. RuntimeType은 Type의 하위 클래스이며 public이 아니기 때문에 의도적으로 알려진 유형으로 참조 할 수 없습니다. RuntimeType과 그 이유에 대한 자세한 내용은 What's the difference between System.Type and System.RuntimeType in C#?을 참조하십시오.

  • 정적 메소드 이름을 소요 KnownTypes 속성을 추가 고려 :

    그래서, 당신은 여기에 두 가지 옵션이 있습니다. 정적 메서드에서, 리플렉션을 사용하는 경우 잠재적으로 RuntimeType을 포함하여 실제로 원하는 다양한 유형을 반환 할 수 있습니다.

  • 내가했던 옵션은 이 메세지 유형에게 TypeHandle 만드는 것입니다 추천 (A RuntimeTypeHandle를.) 이것의 장점은 공개 이후 실제로 알려진 유형 RuntimeTyepHandle을 할 수 있다는 것입니다. 다른 모든 유형과 마찬가지로 직렬화 및 직렬화도 가능합니다. 내 말은 this excellent blog post을 참조하십시오.

+0

도움 주셔서 감사합니다. – GeminiYellow

관련 문제