Как создать удобную функцию DataContractJsonSerialize

StackOverflow https://stackoverflow.com/questions/401348

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть общий код сериализации объекта класса в моих 3-4 методах , поэтому я подумываю создать общую функцию для этого кода и вызывать функцию во всех методах

Я делаю это из следующего кода

DataContractJsonSerializer ser = new DataContractJsonSerializer(this.GetType());
                MemoryStream ms = new MemoryStream();
                ser.WriteObject(ms, this);

                json = Encoding.Default.GetString(ms.ToArray());

                ms.Close();

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

общедоступная строка GenerateJsonString(класс C1)

но это выдает мне ошибку в ключевом слове "class", говорящую о том, что требуется тип

Кто-нибудь может сказать мне, как я могу принять объект всего класса в отдельном методе или функции

Это было полезно?

Решение

Вы путаете "класс" с "объектом".Вы сериализуете объект, который является экземпляром определенного класса (он же "Тип").

Вы можете создать метод, принимающий параметр базового типа .NET для всех объектов, "object", вот так:

public static string GenerateJsonString(object o) 
{
    DataContractJsonSerializer ser = new DataContractJsonSerializer(o.GetType());
    using (MemoryStream ms = new MemoryStream())
    {
        ser.WriteObject(ms, o);
        json = Encoding.Default.GetString(ms.ToArray());
        ms.Close();
        return json;
    }
}

Другие советы

Введите параметр как "объект".Вы не можете передать класс в качестве параметра, только экземпляр класса, который в ООП называется "объектом".

public string GenerateJsonString(object obj)

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

Непонятно, что вы подразумеваете под "объектом класса".Если вы имеете в виду объект, передавая ссылку на объект как обычно, вы передаете "весь объект" (ну, ссылку на него).Вы можете получить доступ ко всем участникам.

Если вы хотите пройти Тип сам по себе параметр следует объявить как Тип - но я подозреваю, что на самом деле это не то, чего ты хочешь.

Если вы хотите написать метод, который будет принимать любой объект, просто объявите параметр как type Объект:

public string GenerateJsonString(object x)

Лично я бы не стал использовать Encoding.Default (который зависит от системы) для преобразования двоичного файла в текст, кстати - какую кодировку на самом деле использует сериализатор?Позволяет ли это вам использовать TextWriter (напримерStringWriter) вместо потока?

Вы можете принять объект.Класс не создается, и его for не может быть передан методу.

Попробуйте использовать Type вместо class

public string GenerateJsonString(Type t1)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top