1 ضمیمه
ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Serialize شده
سلام
فرض کنید کلاسی داریم به نام CourseList :
namespace Project
{
[Serializable]
public class CourseList
{
[XmlElement("Courses",IsNullable =true))]
public List<string> Courses { get; set; }
}
}
درون متد Main یک نمونه از این کلاس میسازیم و نمونه را درون یک فایل Xml سریال می کنیم . (خاصیت Courses را new نمیکنم) :
namespace Project
{
class Program
{
static void Main(string[] args)
{
CourseList SerializedCourses = new CourseList();
XmlSerializer serializer = new XmlSerializer(typeof(CourseList));
TextWriter writer = new StreamWriter("ex.xml");
serializer.Serialize(writer, SerializedCourses );
writer.Close();
Console.ReadKey();
}
}
}
فایل Xml خروجی به شکل زیر است :
کد HTML:
<?xml version="1.0" encoding="utf-8"?>
<CourseList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
حالا همین فایل xml رو Deserialize می کنیم و در آبجکت DeserializedCourses قرار می دهیم :
CourseList DeserializedCourses;
FileStream fs = new FileStream("ex.xml", FileMode.Open);
DeserializedCourses = (CourseList)serializer.Deserialize(fs);
در شی SerializedCourses , فیلد Courses به درستی null است .چون اصلا مقدار دهی و نمونه سازی نشده
ولی مشکل اینجاست که در شی DeserializedCourses , فیلد Courses مقدارش null نیست و یرای خاصیت Courses نمونه ساخته شده و من متوجه نمیشم که چطور.
این هم عکس از پنجره Watch محیط Debugging :
ضمیمه 153849
ممنون میشم نظرتون رو بگید.
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
IsNullable را برای پراپرتی هایی که میتونن null باشند، ست کنید.
https://docs.microsoft.com/en-us/dot...ute.isnullable
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
نقل قول:
نوشته شده توسط
Mahmoud.Afrad
سلام و تشکر
من IsNullable رو برای هر دو حالت هم true هم false ست کردم. هیچ تفاوتی نداره.
در هر حال نمونه سازی میشه
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
خروجی xml در این دو حالت تفاوتی هم داره یا نه؟
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
نقل قول:
نوشته شده توسط
Mahmoud.Afrad
خروجی xml در این دو حالت تفاوتی هم داره یا نه؟
خروجی xml هر دو یکسان است :
کد HTML:
<?xml version="1.0" encoding="utf-8"?>
<CourseList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
اجبار خاصی وجود داره که از فرمت Xml برای پروسه Serialization/DeSerialization استفاده می کنید؟
استفاده از فرمت JSON خیلی راحت تره، ابزارهای Serialization اش هم خیلی بروزتر و مدرن تر هستند، حجم خروجی سریالایز شده اش هم کمتره، و در صورت نیاز به استفاده از آبجکت سریالایز شده در تکنولوژی هایی غیر مبدا، خیلی راحت تر خواهید بود.
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
نقل قول:
نوشته شده توسط
مهدی کرامتی
اجبار خاصی وجود داره که از فرمت Xml برای پروسه Serialization/DeSerialization استفاده می کنید؟
استفاده از فرمت JSON خیلی راحت تره، ابزارهای Serialization اش هم خیلی بروزتر و مدرن تر هستند، حجم خروجی سریالایز شده اش هم کمتره، و در صورت نیاز به استفاده از آبجکت سریالایز شده در تکنولوژی هایی غیر مبدا، خیلی راحت تر خواهید بود.
اجبار خاصی نیست واقعا
فقط این قضیه ذهنم رو مشغول کرده بود
فقط یه وسواس فکری شده برام .... در هر حال ممنون
توی سایت StackOverFlow م سوال رو مطرح کردم ولی اونجا هم جوابی نگرفتم
C# - The Deserialized Object is different from the Serialized Object with the same class - Stack Overflow
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
با معرفی نوع داده , isnullable هم کار کرد
[XmlElement(
Type = typeof(List<string>) ,
IsNullable = true)
]
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
نقل قول:
نوشته شده توسط
Mahmoud.Afrad
با معرفی نوع داده , isnullable هم کار کرد
[XmlElement(
Type = typeof(List<string>) ,
IsNullable = true)
]
سلام و تشکر بابت پیگیری شما
کلاس را طبق راهنمایی شما تغییر دادم ولی همچنان فیلد Courses شی DeserializedCourses که از فایل ex.xml استخراج شده مقدارش null نمیشه . در صورتی که فیلد Courses شی SerializedCourses که فایل ex.xml از سریال کردن اون ایجاد شده مقدارش null
namespace TreeProject
{
[XmlRoot(ElementName = "CourseList")]
public class CourseList
{
[XmlElement(Type =typeof(List<string>),IsNullable =true)]
public List<string> Courses { get; set; }
}
}
1 ضمیمه
نقل قول: ناهمخوانی شی منتج شده از Desrialize کردن فایل Xml با آبجکت اولیه که فایل Xml از روی آن Seri
سلام ،
از کتابخانه Protobuf استفاده کنین. چندین برابر از Serialization مایکروسافت و JSON سریعتر و قوی تره.
از طریق دستور زیر در Package Manager میتونین Protobuf رو به پروژتون اضافه کنین.
Install-Package protobuf-net
[ProtoContract]
public class CourseList
{
[ProtoMember(1)]
public List<string> Courses { get; set; }
}
public byte[] Serialize(CourseList input)
{
using (MemoryStream memoryStream = new MemoryStream())
{
Serializer.Serialize(memoryStream, input);
return memoryStream.ToArray();
}
}
public CourseList DeSerialize(byte[] data)
{
return Serializer.Deserialize<CourseList>(new MemoryStream(data));
}
چند نکته :
- تقریبا تمامی ابزار های Serialization با Dictionary ها مشکل دارن ، پس از Dictionary ها استفاده نکنین.
- خروجی Protobuf از نوع byte[] هستش یعنی داده واقعی که میتونین توی فایل ذخیره کنین و حتی همونو روی شبکه Transfer کنین ولی خروجی JSON ها Text هستش که این خیلی میتونه دردسر ساز بشه.
- عملکرد Protobuf خیلی سریعتر از Serialization های مایکروسافته ، ضمنا Binary Serialization منسوخ شده (کلیک کنین)