2012-12-10 2 views
4

다음 클래스의 객체를 직렬화하고 던져진 예외를 무시하는 방법이 있습니까? 그것은 ButIAm 속성 값을 직렬화 할 때 NotImplementedException을 던지는 Serialize 속성

public class HardToSerialize 
{ 
    public string IAmNotTheProblem { get; set; } 
    public string ButIAm { get { throw new NotImplementedException(); } } 
} 

없음 놀랍게도 Newtonsoft 오류가 발생합니다.

클래스에 액세스 할 수 없어서 어떤 속성으로도 꾸밀 수 없습니다.

설명 :이 작업을 의 NotImplementedException을 throw하는 속성이있는 개체에서 사용하고 싶습니다. HardToSerialize 클래스는 하나의 예일뿐입니다.

답변

6

저에게 도움이되는 해결책을 찾았습니다. 이런 일을하는 데 큰 문제가 있습니까?

var settings = new JsonSerializerSettings(); 
settings.Error += (o, args) => { 
    if(args.ErrorContext.Error.InnerException is NotImplementedException) 
     args.ErrorContext.Handled = true; 
}; 

var s = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, settings); 
1

가능한 해결 방법은 EasyToSerialize에서 다른 개체를 만든 다음이를 직렬화하는 것입니다.

[Serializable] 
public class EasyToSerialize 
{ 
    public string IAmNotTheProblem { get; set; } 

    // other serializable properties 
} 


HardToSerialize x = ...; 

var foo2 = new EasyToSerialize { 
    IAmNotTheProblem = x.IAmNotTheProblem 
    // other properties here 
}; 
2

나는 대리 클래스와 사용자 정의 JsonConverter 갈 것입니다 :

public class HardToSerializeSurrogate 
{ 
    public string IAmNotTheProblem { get; set; } 
    public string ButIAm { get; set; } 
} 

public class HardToSerializeConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(HardToSerialize); 
    } 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var item = (HardToSerialize)value; 

     // fill the surrogate with the values of the original object 
     var surrogate = new HardToSerializeSurrogate(); 
     surrogate.IAmNotTheProblem = item.IAmNotTheProblem; 

     serializer.Serialize(writer, surrogate); 
    } 
} 

사용법 : 당신이 직렬화해야하는 경우 사용자 정의 JsonConverter을 구현

물론
static void Main(string[] args) 
{ 
    var hardToSerialize = new HardToSerialize() { IAmNotTheProblem = "Foo" }; 
    var s = JsonConvert.SerializeObject(hardToSerialize, 
             new HardToSerializeConverter()); 
} 

정말 가치가있다 HardToSerialize 개체 목록 또는이 형식을 포함하는 개체
한편, HardToSerialize 개체를 매번 serialize하려는 경우 개체의 대리 복사본을 만든 다음 사용자 지정 JsonConverter을 구현하지 않고 개체를 직렬화하면됩니다.

+0

NotImplementedException을 throw하는 속성이있는 모든 개체에서이 기능을 사용하고 싶습니다. 나는 그 질문을 갱신했다. –

+0

@JesperPalm : 구현되지 않은 속성이있는 클래스는 예외가 아니어야합니다. 그것들은 당신이 원하고 원하지 않는 수업에 대해 더 많은 통제권을 부여하기 때문에 각자의 대리자와 함께 갈 것입니다. 실제로 Error 이벤트를 처리하면 예외가 발생하고 catch되기 때문에 성능이 저하 될 수 있습니다. – digEmAll

관련 문제