Я нашел чистый способ достичь того, что вы ищете, не нарушая ваш дизайн.
Использование этого метода гарантирует, что ваш конструктор будет вызван и ваше поле только для чтения правильно установлено.
Что вам нужно, так это на самом деле сериализовать и десериализовать [DataMember]
помеченные поля из класса DataModel.
Это предотвратит непреднамеренное поведение, зная, что DataContractSerializer не вызывает конструктор при десериализации.
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; }
}
}
Для десериализации и сериализации теперь вы можете использовать этот класс для хранения ваших значений.
После загрузки вы можете создать новый объект модели данных и передать его вашему классу, для которого необходимо вызвать его конструктор.
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);
}
После сохранения вы можете извлечь необходимые данные из вашего класса, содержащие поле 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);
}
Конечно, вам придется добавить перегрузку в конструктор, и вам, возможно, придется немного подправить пример, но я думаю, что вы получили картину.