Deserializing जब मेरे पास एक संरक्षित फ़ील्ड को परिभाषित करता है। संरक्षित क्षेत्र में फ़ील्ड प्रारंभकर्ता है।सी # कक्षा में फ़ील्ड इनिशिलाइज़र
जब मैं ठोस वर्ग को deserialize, फ़ील्ड प्रारंभकर्ता नहीं चलाया जाता है। क्यूं कर? समस्या को हल करने के लिए सबसे अच्छा पैटर्न क्या है? अगर मैं एक निर्माता में प्रारंभिक स्थानांतरित करता हूं, तो कन्स्ट्रक्टर भी नहीं बुलाया जाता है।
[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
}
}
मूल वर्ग पदानुक्रम
[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);
}
}
सहायक विधि
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;
}
}
अमूर्त में संरक्षित कन्स्ट्रक्टर जोड़ने का प्रयास किया जहां आप dict प्रारंभ करते हैं? MyConcrete में एक सार्वजनिक कन्स्ट्रक्टर प्रदान करें जो 'आधार() 'तक चेन करता है। – Will
मैंने इसे सिर्फ एक वर्ग में फटकार दिया और एक कन्स्ट्रक्टर जोड़ा। कन्स्ट्रक्टर का आह्वान नहीं किया जा रहा है। इस संबंधित पोस्ट को मिला है कि दावा करता है कि फील्ड प्रारंभकर्ता और कन्स्ट्रक्टरों का आह्वान नहीं किया जाता है ... http://stackoverflow.com/questions/5021973/constructors-not-called-on-deserialization –