deserializing नहीं है मैं सी # XmlSerializer के लिए नया हूँ तो मुझे यहां कुछ बुनियादी याद आ रही है।XmlSerializer.Deserialize() एक सूची <T> सही ढंग से
जिस समस्या में मैं दौड़ रहा हूं वह यह है कि मेरे पास एक वर्ग है जिसमें List<T>
किसी अन्य वर्ग का है। जब मैं मुख्य वर्ग को क्रमबद्ध करता हूं तो एक्सएमएल सुंदर दिखता है और सभी डेटा बरकरार है। जब मैं एक्सएमएल को deserialize, List<T>
में डेटा गायब हो जाता है और मुझे खाली List<T>
के साथ छोड़ दिया गया है। मुझे कोई त्रुटि नहीं मिल रही है और धारावाहिक भाग आकर्षण की तरह काम करता है।
मुझे deserialization प्रक्रिया के साथ क्या याद आ रही है?
संपादित करें: ध्यान दें कि नीचे दिखाया गया कोड समस्या को पुन: उत्पन्न नहीं करता है - यह काम करता है। यह वास्तविक कोड का सरलीकृत संस्करण था, जिसने काम नहीं किया था। दुर्भाग्यवश, नीचे दिया गया कोड समस्या को पुन: उत्पन्न करने के लिए पर्याप्त सरलीकृत नहीं था!
public class User
{
public User()
{
this.Characters = new List<Character>();
}
public string Username { get; set; }
public List<Character> Characters { get; set; }
}
public class Character
{
public Character()
{
this.Skills = new List<Skill>();
}
public string Name { get; set; }
public List<Skill> Skills { get; set; }
}
public enum Skill
{
TreeClimber,
ForkliftOperator
}
public static void Save(User user)
{
using (var textWriter = new StreamWriter("data.xml"))
{
var xmlSerializer = new XmlSerializer(typeof(User));
xmlSerializer.Serialize(textWriter, user);
}
}
public static User Restore()
{
if (!File.Exists("data.xml"))
throw new FileNotFoundException("data.xml");
using (var textReader = new StreamReader("data.xml"))
{
var xmlSerializer = new XmlSerializer(typeof(User));
return (User)xmlSerializer.Deserialize(textReader);
}
}
public void CreateAndSave()
{
var character = new Character();
character.Name = "Tranzor Z";
character.Skills.Add(Skill.TreeClimber);
var user = new User();
user.Username = "Somebody";
user.Characters.Add(character);
Save(user);
}
public void RestoreAndPrint()
{
var user = Restore();
Console.WriteLine("Username: {0}", user.Username);
Console.WriteLine("Characters: {0}", user.Characters.Count);
}
एक्सएमएल CreateAndSave (क्रियान्वित द्वारा उत्पन्न) तो दिखाई देता है:
<User>
<Username>Somebody</Username>
<Characters>
<Character>
<Name>Tranzor Z</Name>
<Skills>
<Skill>TreeClimber</Skill>
</Skills>
</Character>
<Characters>
</User>
बिल्कुल सही! जिस तरह से इसे देखना चाहिए। मैं तो RestoreAndPrint()
निष्पादित अगर मैं प्रयोक्ता नाम संपत्ति के साथ एक उपयोगकर्ता वस्तु ठीक से सेट मिलता है लेकिन वर्ण संपत्ति एक खाली सूची है:
Username: Somebody
Characters: 0
किसी को क्यों वर्ण संपत्ति ठीक से धारावाहिक है मेरे लिए व्याख्या कर सकते हैं लेकिन deserialize नहीं होगा?
आपको प्रकारों पर [Serializable] की आवश्यकता नहीं है। एक्सएमएल सीरिएलाइज़र का व्यवहार उस विशेषता से पूरी तरह से स्वतंत्र है। – Cheeso
ठीक है; इसलिए जब से हम (या मुझे, कम से कम) संदेह है कि समस्या "असली" कोड में है (दिखाया नहीं गया है); क्या आप सूचियों के "सेट" एक्सेसर में कुछ भी दिलचस्प करते हैं? यह पहला स्थान होगा जो मैं देखता हूं। –
नहीं, वे सभी बुनियादी गुण हैं जिनके पास प्राप्त या सेट एक्सेसर्स में कुछ भी नहीं है। वे सब थोड़े दिखते हैं: सार्वजनिक टी संपत्ति नाम {प्राप्त करें; सेट; } – Andy