Question

Je sais qu'un constructeur privé sans paramètre fonctionne, mais qu'en est-il d'un objet sans constructeur sans paramètre?

J'aimerais exposer les types d'une bibliothèque tierce afin que je n'ai aucun contrôle sur les définitions de types.

S'il y a un moyen, quel est le plus facile? Par exemple. Je ne sais pas quoi créer un sous-type.

Modifier:

Ce que je recherche correspond au niveau de personnalisation indiqué ici: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx bien que je ne veuille pas avoir recours à des flux pour sérialiser / désérialiser.

Était-ce utile?

La solution

Vous ne pouvez pas vraiment rendre des types arbitraires sérialisables; dans certains cas ( XmlSerializer , par exemple), le moteur d'exécution présente des options pour usurper les attributs. Mais DataContractSerializer ne le permet pas. Options possibles:

  • cache les classes derrière vos propres types qui sont sérialisables (beaucoup de travail)
  • fournir des substituts de formateur binaire (yeuch)
  • écrivez votre propre noyau de sérialisation (beaucoup de travail pour bien faire les choses)

En gros, si quelque chose n'est pas conçu pour la sérialisation, très peu de l'infrastructure vous laissera vous le sérialiser.

Autres conseils

Je ne suis pas un expert de WCF, mais il est peu probable qu'ils prennent en charge la sérialisation sur un constructeur avec des types arbitraires. Parce que que feraient-ils pour des valeurs? Vous pouvez transmettre la valeur null pour les types de référence et les valeurs vides pour les structures. Mais à quoi servirait un type qui pourrait être construit avec des données complètement vides?

Je pense que vous êtes coincé avec l'une des 2 options

  1. Sous-classez le type en question et transmettez les valeurs par défaut appropriées au constructeur sans paramètre
  2. Créez un type qui n'existe que pour la sérialisation. Une fois terminé, il peut créer une instance du type d'origine qui vous intéresse. C'est un pont.

Personnellement, je choisirais le numéro 2. Faites de la classe une structure de données uniquement et optimisez-la à des fins de sérialisation et d’usine.

Je viens juste de faire un petit test, en utilisant un service WCF qui renvoie un objet de base sans constructeur par défaut.

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

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

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

Voici à quoi ressemble le service:

public class MyService : IMyService
{
    #region IMyService Members

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

    #endregion
}

Cela fonctionne réellement, tant que MyObject est un [DataContract] ou [Serializable]. Fait intéressant, il ne semble pas avoir besoin du constructeur par défaut côté client. Il y a un article lié ici:

Comment la désérialisation WCF instancie-t-elle les objets sans appeler constructeur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top