2011-04-07 3 views
1

다음 코드가 주어질 때개체 필드에 Enum이 설정된 C# DataContractSerializer SerializationException

[DataContract] 
public class TestClass 
{ 
    [DataMember] 
    public object _TestVariable; 

    public TestClass(object value) 
    { 
    _TestVariable = value; 
    } 

    public void Save() 
    { 
    using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(new FileStream("test.tmp", FileMode.Create))) 
    { 
     DataContractSerializer ser = new DataContractSerializer(typeof(TestClass)); 
     ser.WriteObject(writer, this); 
    } 
    } 
} 

public enum MyEnum 
{ 
    One, 
    Two, 
    Three 
} 

_TestVariable이 Enum 값으로 설정된 경우 직렬화에 실패하는 이유는 무엇입니까?

new TestClass(1).Save(); // Works 
new TestClass("asdfqwer").Save(); // Works 
new TestClass(DateTime.UtcNow).Save(); // Works 
new TestClass(MyEnum.One).Save(); // Fails 

throw되는 예외는 다음과 같습니다.

System.Runtime.Serialization.SerializationException : Type 'xxx.MyEnum' with data contract name 'xxx.MyEnum:http://schemas.datacontract.org/2004/07/Tests' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer. 
+1

_TestVariable에'object type'을 사용하여 해결하려는 문제는 무엇입니까? 아마도 실제 문제를 설명 할 수 있습니다. –

+0

비슷한 질문에 대한 답변보기 http://stackoverflow.com/a/8795410/52277 –

답변

5

TestClass에서 KnownTypeAttribute을 사용해야합니다.

[DataContract] 
[KnownTypeAttribute(typeof(MyEnum))] 
public class TestClass 
+0

빙고에'[DataContract]'를 추가하면 작동하지 않습니다! 이것은 컴파일하게 만들지 만 고통입니다. 열거 형은 직렬화 할 수없는 간단한 유형입니까? – mike

+1

그것은 열거 형에 관한 것이 아닙니다. 그것은 정확한 타입 대신 객체 타입의 변수를 사용하는 것입니다. 이 경우 serializer는 serialization 및 deserialization 중에 발생할 유형에 대해 알지 못하므로이 속성을 통해 알 수 있도록해야합니다. 객체가 아닌 정확한 데이터 타입을 사용했다면, 이것은 필요하지 않을 것입니다. – archil

+0

정보, 감사합니다. – mike

0

MyEnum는 직렬화으로 표시되지 않는다. MyEnum에 DataContractAttribute를 추가하면이를 수정해야합니다.

+0

MyEnum – mike

4

당신이 장소는 당신을 위해 일을하는 형태 추론을 사용하는 모든 통해 KnownType 속성을 넣어 것을 피하기 위해 고용 수있는 또 다른 옵션을 선택합니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestClass.Create(1).Save(); // Works 
     TestClass.Create("asdfqwer").Save(); // Works 
     TestClass.Create(DateTime.UtcNow).Save(); // Works 
     TestClass.Create(MyEnum.One).Save(); // Fails 
    } 
} 

public class TestClass 
{ 
    public static TestClass<T> Create<T>(T value) 
    { 
     return new TestClass<T>(value); 
    } 
} 

[DataContract] 
public class TestClass<T> 
{ 
    [DataMember] 
    public T _TestVariable; 

    public TestClass(T value) 
    { 
     _TestVariable = value; 
    } 

    public void Save() 
    { 
     using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(new MemoryStream())) 
     { 
      DataContractSerializer ser = new DataContractSerializer(typeof(TestClass<T>)); 
      ser.WriteObject(writer, this); 
     } 
    } 
} 

public enum MyEnum 
{ 
    One, 
    Two, 
    Three 
} 
관련 문제