2016-07-06 16 views
5

Có cách nào để lấy cài đặt ra khỏi lớp JsonSerializer và triển khai lại chúng trong một JsonSerializer mới không?Sao chép JsonSerializerCài đặt từ JsonSerializer sang JsonSerializer mới

Dường như không có phương pháp nào để làm bất cứ điều gì như thế. Điều tốt nhất tôi tìm thấy là một phương pháp riêng tư được gọi qua sự phản chiếu, ApplySerializerSettings.

Tôi đang cố gắng lấy bộ nối tiếp từ phương thức WriteJson và sao chép nó vào bộ nối tiếp mới, tinh chỉnh nó một chút. Cụ thể là tôi muốn thay thế ContractResolver.

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 

Trả lời

3

Có vẻ như cách tốt nhất là chỉ sao chép tất cả cài đặt vào đối tượng mới. Có một tấn, vì vậy đây là một phương pháp mở rộng tốt đẹp để làm việc với (như 8.0.3).

public static class JsonSerializerExtensions 
{ 
    public static JsonSerializer DeepCopy(this JsonSerializer serializer) 
    { 
    var copiedSerializer = new JsonSerializer 
    { 
     Context = serializer.Context, 
     Culture = serializer.Culture, 
     ContractResolver = serializer.ContractResolver, 
     ConstructorHandling = serializer.ConstructorHandling, 
     CheckAdditionalContent = serializer.CheckAdditionalContent, 
     DateFormatHandling = serializer.DateFormatHandling, 
     DateFormatString = serializer.DateFormatString, 
     DateParseHandling = serializer.DateParseHandling, 
     DateTimeZoneHandling = serializer.DateTimeZoneHandling, 
     DefaultValueHandling = serializer.DefaultValueHandling, 
     EqualityComparer = serializer.EqualityComparer, 
     FloatFormatHandling = serializer.FloatFormatHandling, 
     Formatting = serializer.Formatting, 
     FloatParseHandling = serializer.FloatParseHandling, 
     MaxDepth = serializer.MaxDepth, 
     MetadataPropertyHandling = serializer.MetadataPropertyHandling, 
     MissingMemberHandling = serializer.MissingMemberHandling, 
     NullValueHandling = serializer.NullValueHandling, 
     ObjectCreationHandling = serializer.ObjectCreationHandling, 
     PreserveReferencesHandling = serializer.PreserveReferencesHandling, 
     ReferenceResolver = serializer.ReferenceResolver, 
     ReferenceLoopHandling = serializer.ReferenceLoopHandling, 
     StringEscapeHandling = serializer.StringEscapeHandling, 
     TraceWriter = serializer.TraceWriter, 
     TypeNameHandling = serializer.TypeNameHandling, 
     SerializationBinder = serializer.SerializationBinder, 
     TypeNameAssemblyFormatHandling = serializer.TypeNameAssemblyFormatHandling 
    }; 
    foreach (var converter in serializer.Converters) 
    { 
     copiedSerializer.Converters.Add(converter); 
    } 
    return copiedSerializer; 
    } 
} 

Thật xấu xí, nhưng ít nhất bạn chỉ phải viết một lần. Hãy cẩn thận một chút vì bản thân tài sản không được sao chép sâu.

Trả lời dưới đây sẽ không ổn định tùy theo triển khai của bạn, đặc biệt là khi giải quyết hợp đồng. Giữ nó chỉ trong trường hợp nó giúp ai đó.


Vì vậy, tôi không thể sao chép hoàn toàn cài đặt, nhưng tôi đã tìm được một công việc tốt có thể muốn được xem xét. Bạn có thể chỉ cần thiết lập các thuộc tính mà bạn muốn thay đổi, trong một bối cảnh bị khóa, và sau đó thiết lập lại chúng sau đó.

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    var thing = value as IThing; 

    if (thing == null) 
     throw new ArgumentException($"Writing Json failed because " + 
      "value was not a 'Thing' of type, {typeof(IThing).FullName}"); 

    JObject jsonThing; 
    //If your solution is multithreaded, 
    //and is using a shared serializer (which you probably are), 
    //you should lock the serializer so that it doesn't accidentally use 
    //the "CustomObjectResolver" 
    lock (serializer) 
    { 
     //Hold the original value(s) to reset later 
     var originalContractResolver = serializer.ContractResolver; 
     //Set custom value(s) 
     serializer.ContractResolver = new CustomObjectResolver(); 
     //Serialization with custom properties 
     jsonThing = JObject.FromObject(value, serializer); 
     //Reset original value(s) 
     serializer.ContractResolver = originalContractResolver; 
    } 

    //Finish serializing and write to writer. 
} 
+1

Xin cảm ơn, hãy lưu tôi đánh máy! Bit gộp rằng chúng ta phải làm điều này mặc dù, có thực sự nên có một cái gì đó được xây dựng vào Newtonsoft.Json – Tyson

Các vấn đề liên quan