سؤال

أحاول تحسين تسلسل ريستشارب الافتراضي باستخدام Json.net مكتبة.من أجل تخصيص التسلسل لديك لتنفيذ واجهة إيسيرياليزر:

public class LowerCaseSerializer : ISerializer{
    public LowerCaseSerializer(){
        ContentType = "application/json";
    }

    public string Serialize(object obj){
         var settings = new JsonSerializerSettings{
            ContractResolver = new LowerCaseResolver()
        };
        return JsonConvert.SerializeObject(obj, Formatting.None, settings);
    }

    string ISerializer.RootElement { get; set; }
    string ISerializer.Namespace { get; set; }
    string ISerializer.DateFormat { get; set; }
    public string ContentType { get; set; }
}

كما ترون أنا أيضا تمديد العقد.هذا هو الرمز الفعلي الذي يفعل الأحرف الصغيرة:

public class LowerCaseResolver : DefaultContractResolver{
    protected override string ResolvePropertyName(string propertyName){
        return propertyName.ToLower();
    }
}

مرة واحدة كل هذا هو الإعداد يمكنني استخدامه مع ريستشارب:

var request = new RestRequest(url, method);
if (ShouldAddBody(method)){
    request.JsonSerializer = new LowerCaseSerializer();
    request.AddObject(body);
}
var response = client.Execute<T>(request);

كل شيء يعمل ، باستثناء الخصائص ليست في حالة صغيرة.عند تصحيح الأخطاء ، ينتقل المصحح إلى منشئ المسلسلات ، ولكن لا يتم استدعاء الطريقة أبدا.عندما حاولت بالضبط نفس الشيء ل ديسيرياليزاتيون (واجهة إديسيرياليز ، التي تعلق على العميل) تم استدعاء طريقة لغلاف أقل لكل خاصية.

ما حاولت أيضا:

request.RequestFormat = DataFormat.Json;  // no change
// this correctly lower cases the properties
var json = new LowerCaseSerializer().Serialize(body);
// wrong request sent to the server, it tells me that some property is missing
request.AddBody(json);
// the exact same thing with this
request.AddParameter("application/json", json, ParameterType.RequestBody);

الشيء الذي لاحظته مع الأخيرين:إذا كان لدي خصائص حالة أقل والسماح ريستشارب تسلسل ثم الطلب لديه 5 المعلمات (واحد لكل خاصية).إذا أضفته عبر طريقتين العليا لديها خاصية واحدة فقط وهذا هو جسون كله.

أتحقق من قضايا ريستشارب دون جدوى.أي اقتراحات?

تحديث:

هذا غريب جدا:

  • متشعب الباقيحاد ، مثبت Json.net ، يعمل بشكل جيد
  • نسخ فئة ريستركست من ريستشارب شوكة ، لصق إلى طلبي ، استخدامه ، يعمل بشكل جيد
  • بدأ مشروع جديد ، تثبيت ريستشارب و Json.net عبر مدير الحزم ، يعمل بشكل جيد

ثم إزالة جميع الحزم من طلبي الرئيسي ، إعادة تحميل ، لا يعمل.كيندا التخلي عن هذا.

تحديث 2: التصحيح من خلال إصدار متشعب لاحظت هذا:يجب أن يكون ريكستفورمات داتافورمات.جسون أو أنها سوف تستخدم شمل المسلسل.لكن هذا لا يحل المشكلة.حاولت تعيين كل من (هناك اثنين فقط) المسلسلات إلى فارغة:

request.JsonSerializer = null;
request.XmlSerializer = null;

في المشروع الجديد فعلت هذا يسبب نولريفيرنسيكسيبتيون كما هو متوقع.لكن في القديم لا يحدث شيء.حاولت إعادة تسمية المتغيرات ، مما يجعل متغير آخر من نفس النوع ، ولكن لا شيء إصلاحات.يبدو فقط أنه في المشروع لدي فئة ريستركست هو تنصتت بطريقة أو بأخرى.

لقد أضفت أيضا مشروعا جديدا إلى الحل.وحتى هناك يعمل الرمز.لذلك هو مجرد مشروع واحد لديه المشكلة.

هل كانت مفيدة؟

المحلول

نظرا لأنه لا يمكنك إعادة إنتاجه في مشروع جديد ، يجب أن يكون هناك شيء مختلف يحدث في هذا المشروع بالذات ، مما يتسبب في حدوث المشكلات التي تصفها.

بضعة أشياء يمكنك تجربتها (بدون ترتيب معين):

  • تحقق من أنك تستخدم نفس الإصدار الدقيق من المكتبة في كلا المشروعين (الذي يعمل والذي لا يعمل):إصدار الحزمة والمنصة المستهدفة (صافي 4 ، صافي 35...).

  • حذف packages مجلد المشروع الخاص بك غير العاملة بحيث نوجيت سوف تضطر إلى إعادة تحميل جميع الحزم.

  • ابحث عن المسار الدقيق للمكتبة المشار إليها في نافذة خصائص الاستوديو المرئي عندما يكون لديك ريستشارب من عقدة المراجع المحددة.قم بمقارنة ثنائية بين المكتبات المشار إليها من قبل العمل والمشروع غير العامل.

  • للأسف ليس هناك حزمة رمز ل ريستشارب على رمزمصدر, ، لذلك لا يمكنك تصحيح ريستشارب مباشرة في مشروعك غير العامل.يمكنك استخدام Reflector.NET فسبرو إذا كان لديك الترخيص أو لم تستخدم التجربة من قبل.

  • انقل أجزاء من مشروعك غير العامل إلى المشروع العامل حتى يتوقف عن العمل.

تحرير:

النظر في شفرة المصدر من RestRequest, AddObject لا يبدو أن استخدام JsonSerializer أنت تضع.هل حاولت استخدام AddBody في حين أن?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top