PDA

View Full Version : مشکل در Serializing



EhsanKhafan
چهارشنبه 01 تیر 1384, 10:05 صبح
سلام
من برای سریالایزودیسریالایز کردن یک کلاسم از مثال MSDN استفاده کردم .برای سریالایز کردن و ریختن روی فایل:

MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin",
FileMode.Create,
FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
بعد وقتی با کد زیر

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin",
FileMode.Open,
FileAccess.Read,
FileShare.Read);
MyObject obj = (MyObject) formatter.Deserialize(fromStream);
stream.Close();
میخوام فایلم رو باز کنم با error زیر مواجه میشم

"Cannot find the assembly MY_Assembly, Version=1.0.1998.33355, Culture=neutral, PublicKeyToken=null."

البته توی فایلی که ساخته Version برابر یک عدد دیگست که هربار اجرا میشه فرق میکنه.
البته کد بالا برای Windows Application ها درست کار میکنه ولی توی پروژه Add-in این ایراد رو میده!!
لطفا اگه کسی میتونه کمک کنه

small_programmer
جمعه 03 تیر 1384, 23:16 عصر
آیا از [()Serializable] در تعریف کلاس MyObject استفاده کرده ای؟

FastCode
پنج شنبه 14 مرداد 1389, 10:25 صبح
علت:
البته توی فایلی که ساخته Version برابر یک عدد دیگست که هربار اجرا میشه فرق میکنه.راه حل:


formatter (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.bin aryformatter.aspx) . AssemblyFormat (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.bin aryformatter.assemblyformat.aspx) = FormatterAssemblyStyle (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.formattera ssemblystyle.aspx) . Partial

حامد مصافی
پنج شنبه 14 مرداد 1389, 10:27 صبح
در سريالي كردن به صورت بايناري اطلاعات كلاس مانند نسخه و PublicKeyToken هم ذخيره مي شوند و در بازگرداندن شي اين اطلاعات مورد مطابقت قرار مي گيرند. حدس مي زنم فايل MyFile.bin شما مربوط به قبل از آخرين كامپايل نرم افزار است كه در اين صورت اين فايل معتبر نخواهد بود.
اين يك مشكل بزرگ براي ساختن برنامه هاي مبتني بر سند از طريق سريالي كردن بايناري است. هر فايل با نسخه هاي جديد سازگار نيست. براي حل اين مشكل دو راه حل داريد:


قسمت مربوط به سريالي كردن را در يك dll مجزا بنويسيد، البته به شرطي كه در آينده نياز به ارتقا نخواهد داشت (به همين دليل توصيه نمي شود)
از سريالي xml استفاده كنيد. البته اين روش هم محدود به انواعي از داده است كه قابل تبديل به رشته باشند؛ لذا براي داده هاي پيچيده تر بايد راهكار خاص خود (فرمت xml) را در نظر بگيريد.