Encontré una manera limpia de lograr lo que busca sin romper su diseño.
Al usar este método, se asegurará de que se invoque su constructor y que se configure correctamente el campo de solo lectura.
Lo que se necesita es para serializar y deserializar [DataMember]
campos marcados con son de una clase DataModel realidad.
Eso evitará que ocurra un comportamiento no deseado sabiendo que DataContractSerializer no llama al constructor al deserializar.
namespace MyApp.DataModel
{
//It is not mandatory to specify the DataContract since a default one will be
//provided on recent version of .Net, however it is a good practice to do so.
[DataContract(Name = "MyClassDataModel", Namespace = "MyApp.DataModel")]
public class MyClassDataModel
{
[DataMember]
public bool DataMemberExample{ get; set; }
}
}
Para deserializar y serializar, ahora puede usar esta clase para mantener sus valores.
Al cargar, puede crear un nuevo objeto de modelo de datos y pasarlo a su clase que necesita tener su constructor llamado.
public MyObjectThatNeedToBeConstructed LoadData(){
// ...
// get your reader (Stream) from the file system or wherever it's located
var deserializer = new DataContractSerializer(typeof(MyClassDataModel));
var storedModel = (MyClassDataModel)deserializer.ReadObject(reader);
return new MyObjectThatNeedToBeConstructed(storedModel);
}
Al guardar, puede extraer los datos requeridos de su clase que contienen el campo ReadOnly.
public void SaveData(MyObjectThatNeedToBeConstructed myObject){
// ...
// get your writer (Stream) from memory or wherever it's located
var serializer = new DataContractSerializer(typeof(MyClassDataModel));
var dataModel = new MyClassDataModel{ DataMemberExample = myObject.DataMember};
serializer.WriteObject(writer, dataModel);
}
Por supuesto, usted tendrá que añadir una sobrecarga al constructor y es posible que tenga que ajustar un poco el ejemplo, pero creo que tienes la imagen.
¿Por qué no lo intentas? – svick
@svick: No se me ocurre ningún mecanismo para realizar la iniciación. DataContractSerializer utiliza 'FormatterServices.GetUninitializedObject' para" construir "un objeto vacío y no invoca un constructor ni ejecuta inicializadores de campo. Por lo que entiendo, un campo 'readonly' solo se puede inicializar de una de esas dos maneras (pero espero que haya otra forma con la que no estoy familiarizado). –
Oh, pensé que querías deserializar el campo.¿Le entiendo correctamente que, por ejemplo, desea establecer el campo en un valor predeterminado, que no proviene de los datos serializados? – svick