Заполнение объекта при инициализации с использованием его конструктора и объекта, возвращенного из сериализованного потока

1

Я пишу обертку для статического API (Jenkins CI), и я пытаюсь упростить свою жизнь при работе с сериализованными объектами, получаемыми из.Net System.Net.WebResponse, путем записи функции в класс объекта для выполнения WebRequest и получить объект. Это работает нормально, пока я не хочу инициализировать экземпляр объекта в его конструкторе. Вот что я имею в виду:

[DataContract]
public class ApiData
{
    public ApiData(string url)
    {
       // Assignment of object instance here 
    }

    [DataMember]
    public List<object> actions { get; set; }
    [DataMember]
    public string description { get; set; }
    [DataMember]
    public string displayName { get; set; }
    ...
    [DataMember]
    public List<object> upstreamProjects { get; set; }

    public ApiData get_job_data(string url)
    {
        var request = WebRequest.Create(url);
        var response = request.GetResponse();

        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ApiData));
        return (ApiData)serializer.ReadObject(response.GetResponseStream());
    }
}

Затем, когда я создаю экземпляр объекта, как показано ниже, у меня будет полностью инициализированный объект только в одной строке.

        string job_url = "http://apihost.com/dir/job/api/json";
        ApiData job_data = new ApiData(job_url);

Я знаю, что я могу просто назначить каждое свойство из возвращаемого сериализованного объекта каждому свойству экземпляра, но список свойств довольно длинный, и эта работа будет повторяться еще для нескольких классов. Это то, что я хочу сделать возможным? Я что-то пропустил?

Теги:

2 ответа

0
Лучший ответ

Поэтому, подумав об этом, я в основном пытаюсь вернуть значение новому объекту с использованием конструктора объектов, что просто глупо. Я также пытался сохранить только одну строку за счет сокращения

ApiData job_data = new ApiData();
job_data = ApiData.get_job_data(job_url);
// get_job_data() only exists really to save time writing out the webrequest,
// so I included it as a class method

в

ApiData job_data = new ApiData(job_url);

Это тривиально. Когда я буду называть это, я, скорее всего, буду заботиться только о одном или двух значениях, поэтому я не буду экономить много времени. Это мой первый вопрос в StackOverflow, поэтому я постараюсь немного подумать, прежде чем спрашивать. Спасибо, Юваль Ицчаков, за ваш ответ.

0

Если я правильно понимаю, вам нужен общий метод десериализации. Вы можете написать Generic метод с параметром T который вы можете вызвать на всех объектах, которые вы хотите десериализовать.

Это может выглядеть так:

public static class RequestDeserializer
{
    public static T SendRequestAndDeserialize<T>(string url) where T : new()
    {
        var request = WebRequest.Create(url);
        var response = request.GetResponse();

        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        return (T)serializer.ReadObject(response.GetResponseStream());
    }
}

и затем назовите его следующим образом:

var myDeserializedObject = RequestDeserializer.SendRequestAndDeserialize<ApiData>(url);

Конечно, этот пример не включает обработку Exception которая должна быть принята во внимание, и, конечно же, архитектура вашей системы, это может быть более подходящим на уровне Data Access Layer данным вашего кода.

Я бы предложил заглянуть в Json.NET, поскольку он значительно упрощает работу с данными JSON :)

  • 1
    Спасибо за ваш ответ. У меня нет проблем с сериализацией ответа. Я надеялся поместить объект get и сериализовать код в конструктор для инициализации экземпляра объекта при объявлении нового ApiData (url) ... подождите минуту. Я очень глупый. Смотри ответ.
  • 0
    Извините - не обращайте внимания на последнюю часть моего предыдущего комментария. Мой ответ - то, что я закончил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню