Mam klasę, która definiuje chronione pole. Chronione pole ma inicjator pola.Inserator pola w klasie C# nie jest uruchamiany podczas odwzorowywania
Po deserializacji konkretnej klasy inicjalizator pola nie jest uruchamiany. Czemu? Jaki jest najlepszy wzór, aby rozwiązać problem? Jeśli przeniesię inicjalizację do konstruktora, konstruktor również nie zostanie wywołany.
[DataContract]
public class MyConcrete
{
// FIELD INITIALIZER DOES NOT RUN WHEN COMMENTED IN:
protected readonly Dictionary<int, string> myDict;// = new Dictionary<int, string>();
public MyConcrete()
{
myDict = new Dictionary<int, string>();
}
private bool MyMethod(int key)
{
return myDict.ContainsKey(key);
}
private int myProp;
[DataMember]
public int MyProp
{
get { return myProp; }
set { bool b = MyMethod(value); myProp = value; } // Call MyMethod to provoke error
}
}
ORIGINAL hierarchii klas
[DataContract]
public abstract class MyAbstract
{
// THIS INITIALIZER IS NOT RUN WHILE DESERIALIZING:
protected readonly Dictionary<int, string> myDict = new Dictionary<int, string>();
private bool MyMethod(int key)
{
return myDict.ContainsKey(key);
}
private int myProp;
[DataMember]
public int MyProp
{
get { return myProp; }
set { bool b = MyMethod(value); myProp = value; } // Call MyMethod to provoke error
}
}
[DataContract]
public class MyConcrete : MyAbstract
{
}
class Program
{
static void Main(string[] args)
{
string tempfn = Path.GetTempFileName();
MyConcrete concrete = new MyConcrete() { MyProp = 42 };
string data = concrete.SerializeToString<MyConcrete>();
MyConcrete rehydrated = SerializationHelper.DeserializeFromString<MyConcrete>(data);
}
}
WSPOMAGAJĄCE METODY
static public string SerializeToString<T>(this T obj)
{
return SerializationHelper.SerializeToString<T>(obj);
}
static public string SerializeToString<T>(T obj)
{
DataContractSerializer s = new DataContractSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
s.WriteObject(ms, obj);
ms.Position = 0;
using (StreamReader sr = new StreamReader(ms))
{
string serialized = sr.ReadToEnd();
return serialized;
}
}
}
static public T DeserializeFromString<T>(string serializedDataAsString)
{
DataContractSerializer s = new DataContractSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(serializedDataAsString)))
{
object s2 = s.ReadObject(ms);
return (T)s2;
}
}
Próbowałem dodać chroniony konstruktor w abstrakcyjnym miejscu, w którym zainicjowałeś dyktando? Podaj publiczny konstruktor w MyConcrete, który prowadzi łańcuch do ': base()'. – Will
Spłaszczyłem to w jednej klasie i dodałem konstruktora. Konstruktor nie jest wywoływany. Znalazłem ten powiązany wpis, że inicjatory pól i konstruktory pól nie są wywoływane ... http://stackoverflow.com/questions/5021973/constructors-not-called-on-deserialization –