Pergunta

Eu sei que uma empresa privada obras construtor sem parâmetros, mas que sobre um objeto com nenhum construtor sem parâmetros?

Gostaria de expor tipos de uma biblioteca de terceiros, por isso tenho nenhum controle sobre as definições de tipo.

Se houver uma maneira que é o mais fácil? Por exemplo. Eu não o que tem que criar um tipo de sub.

Editar:

O que eu estou procurando é algo como o nível de personalização mostrado aqui: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx embora eu não quero ter que recorrer a correntes para serializar / desserializar.

Foi útil?

Solução

Você não pode realmente fazer tipos arbitrários serializado; em alguns casos (XmlSerializer, por exemplo) o tempo de execução expõe opções para falsificar os atributos. Mas DataContractSerializer não permite isso. opções viáveis:

  • esconder as classes atrás de seus próprios tipos de que são serializáveis ??(lotes de trabalho)
  • fornecer substitutos formatador binário (yeuch)
  • escrever seu próprio núcleo de serialização (um monte de trabalho para obter direito)

Essencialmente, se algo não é concebido para serialização, muito pouco do quadro irá deixe serializar-lo.

Outras dicas

Eu não sou um especialista em WCF, mas é improvável que eles apoiar serialização em um construtor com tipos arbitrários. Ou seja, porque o que eles passam em para valores? Você poderia passar null para tipos de referência e valores vazios para estruturas. Mas que bom seria um tipo de ser que poderia ser construído com dados completamente vazias?

Eu acho que você está preso com 1 de 2 opções

  1. Sub classe do tipo em questão e passar valores padrão apropriadas para o parâmetros não construtor
  2. Criar um tipo que existe soley para serialização. Depois de concluído, pode criar uma instância do tipo original que você está interessado. É uma ponte de tipos.

Pessoalmente, eu iria para # 2. Verifique a classe uma única estrutura de dados e otimizá-lo para fins de serialização e de fábrica.

Eu corri um pequeno teste, usando um serviço WCF que retorna um objeto básico que não tem um construtor padrão.

//[DataContract]
//[Serializable]
public class MyObject
{
    public MyObject(string _name)
    {
        Name = _name;
    }

    //[DataMember]
    public string Name { get; set; }

    //[DataMember]
    public string Address { get; set; }
}

Aqui está o que os olhares de serviços como:

public class MyService : IMyService
{
    #region IMyService Members

    public MyObject GetByName(string _name)
    {
        return new MyObject(_name) { Address = "Test Address" };
    }

    #endregion
}

Isso realmente funciona, desde que MyObject é ou um [DataContract] ou [Serializable]. Curiosamente, não parece precisar o construtor padrão no lado do cliente. Há um post relacionado aqui:

Como objetos instanciar WCF desserialização sem convocar uma construtor?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top