Como construir função de conveniência DataContractJsonSerialize
Pergunta
Eu tenho um código comum de serialização de um objeto de classe em meus 3-4 métodos, por isso estou pensando em criar uma função comum para essa função código e chamadas em todos os métodos
Estou doingn isso o seguinte código
DataContractJsonSerializer ser = new DataContractJsonSerializer(this.GetType());
MemoryStream ms = new MemoryStream();
ser.WriteObject(ms, this);
json = Encoding.Default.GetString(ms.ToArray());
ms.Close();
Eu quero colocar esse código comum em função geral seprate que retorna string JSON e que aceitem toda a classe como parâmetro de entrada como eu estou convertendo toda a classe em um objeto JSON, eu tentei criar função como
GenerateJsonString public string (classe C1)
mas isso está me dando erro na palavra-chave "class", dizendo que tipo é necessário
Alguém pode me dizer como posso aceitar objeto de classe inteira no método ou função seprate
Solução
Você está confundindo uma "classe" com um "objeto". Serializar um objeto, que é uma instância de uma determinada classe (aka "Type").
Você pode criar um método de tomar um parâmetro do tipo base .NET para todos os objetos, "objeto", como este:
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;
}
}
Outras dicas
Digite o parâmetro como "objeto". Você não pode passar uma classe como um parâmetro, apenas uma instância de uma classe - que em OOP é referido como um "objeto"
public string GenerateJsonString(object obj)
Se todos os objetos que você está passando para este método são instâncias de classes que derivam de uma classe base comum, então você pode usar polimorfismo e escrever o método para aceitar objetos que são instâncias da classe base. Caso contrário, todas as classes são derivadas de System.Object
.
Não está claro o que você quer dizer com "objeto de classe". Se você quer dizer um objeto, passando uma referência para o objeto como normal não passar "todo o objeto" (bem, uma referência a ele). Você pode obter a todos os membros.
Se você quiser passar o tipo em si, você deve declarar o parâmetro como Digite -. mas eu suspeito que não é realmente o que você quer
Se você quer escrever um método que irá aceitar qualquer objeto, basta declarar o parâmetro como tipo objeto :
public string GenerateJsonString(object x)
Pessoalmente, eu não usaria Encoding.Default
(que é específico do sistema) para converter o binário para texto, por sinal - o que a codificação é o serializador realmente usando? Será que deixá-lo passar em um TextWriter (por exemplo, um StringWriter) em vez de um fluxo?
Você pode aceitar um objeto. Uma classe não é instanciado e ali para não pode ser passado para o método.
Tente usar Tipo em vez de classe
public string GenerateJsonString(Type t1)