J'ai eu un problème similaire avec sérialisation types immuables avant, à la fin j'ai décidé de mettre en œuvre l'interface ISerializable et utiliser SerializationInfo pour stocker & récupérer les variables privées aux deux extrémités du processus de sérialisation/désérialisation:
http://theburningmonk.com/2010/04/net-tips-making-a-serializable-immutable-struct/
Je viens de créer et d'exécuter une application de test en utilisant la même technique et cela semble fonctionner pour moi. Donc, en termes de changements à votre classe clinique, vous pouvez changer à:
[Serializable]
public class Clinic : ISerializable
{
public Clinic(string name, string id)
{
Name = name;
Id = id;
}
public Clinic(SerializationInfo info, StreamingContext context)
{
Name= info.GetString("Name");
Id= info.GetString("Id");
}
public string Name{get; private set;}
public string Id{get; private set;}
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
info.AddValue("Id", Id);
}
}
Cela permettra de résoudre le problème que vous rencontrez passer les données à partir WCF. Mais d'un point de vue design, je suis d'accord avec ce que dit Ladislav et vous voudrez généralement séparer vos objets de domaine avec des objets purement destinés au passage de messages (DataTransferObjects), et dans ce cas voici un exemple de la façon dont vous pourriez l'aborder:
// the domain object (NOT EXPOSED through the WCF service)
public class Clinic
{
public Clinic(string name, string id)
{
Name = name;
Id = id;
}
public string Name{ get; private set;}
public string Id{ get; private set;}
// other methods encapsulating some business logic, etc.
...
}
// the corresponding DTO object for the domain object Clinic
// this is the type exposed through the WCF layer, that the client knows about
[DataContract]
public class ClinicDTO
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Id { get; set; }
}
// WCF service contract, NOTE it returns ClinicDTO instead of Clinic
[ServiceContract]
public interface IClinicService
{
[OperationContract]
ClinicDTO GetClinicById(string id);
}
pour soulager la douleur de conversion de la clinique à ClinicDTO, vous pouvez soit ajouter une méthode à la clinique pour faire ceci ou mettre en œuvre un convertisseur implicite/explicite. J'ai un exemple sur la façon de le faire ici: http://theburningmonk.com/2010/02/controlling-type-conversion-in-c/
Espérons que cela aide!
Merci, ça aide beaucoup: P .. et vous avez un joli blog. –
Merci ;-) et heureux de vous aider! – theburningmonk