سلام
اگه ممکنه یک نمونه کد که نحوه سریالیزه کردن یک استراکچر به حالت XML یا Binary حتی المکان به زبون VB بزنید :20:
Printable View
سلام
اگه ممکنه یک نمونه کد که نحوه سریالیزه کردن یک استراکچر به حالت XML یا Binary حتی المکان به زبون VB بزنید :20:
کسی نیست که این کار رو کرده باشه ؟؟نقل قول:
ببینید من میخوام یک سری استراکچر با ساختارهای مختلف ، مثلا استراکچر مشتری ، بانک و . . . رو برای مصارف خاصی که نیاز دارم تو دیتابیسم ذخیره کنم .
اول میخواستم یک تابع بنویسم واسه هر کدوم که استراکچر رو بگیره و کد xml اش رو بده و بلعکس بعد از یه کمی برسی متوجه شدم که دات نت این کار رو به دو شکل انچام میده :
- یکی یک نوع (کلاس - استراکچر - متغیی و . . . ) رو میگیره و کد باینریش رو پس میده و بالعکس
-دیگری هم مثل بالاییه با این تفاوت که کد xm l میده
خروجی xml سرعت کمتری نسبت به xml داره ولی قابلیت حمل داره
من این کار رو تونستم روی یک متغییر انجام بدم ولی روی کلاس و استراکچر نتونستم ، حالا اگه کسی نمونه داره ممنون میشم کمک کنه :11:
فکر کنم مشکلم حل شد !!
این کد برنامم :
تابع GetInfo از کلاس مشتری کد مشتری رو میگیره و استراکچرش رو میدهکد:Dim cls As New CLSCustomer
Dim str As New STRCustomer
str = cls.GetInfo(162)
Dim sr As New Xml.Serialization.XmlSerializer(Str.GetType)
Dim f As System.IO.TextWriter
f = New IO.StreamWriter("C:\aaan.txt")
sr.Serialize(f, str)
f.Close()
اینم خروجی ای که بهم داد :
کد:<?xml version="1.0" encoding="utf-8"?>
<STRCustomer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ID>162</ID>
<Name>کاظم</Name>
<Family>ارين</Family>
<Address1 />
<Address2 />
<Tel1 />
<Tel2 />
<Fax />
<Zip_code />
<Mob1>----</Mob1>
<Mob2 />
<Account>0</Account>
<FirstAccount>0</FirstAccount>
<GroupID>1</GroupID>
<Description />
<Title>0</Title>
</STRCustomer>
هنوز هم یک مشکل دارم !
بعضی از استراکچر هام آرایه ای از استراکچر دارن مثلا :
که در این صورت آرایه رو سریالایز نمیکنه و وزمانی هم که پیش از تعریف آرایه از کلمه <Serializable()> استفاده میکنم میگه که آرایه ها قابلیت سزیالیزه شدن ندارن !کد:<Serializable()> Public Structure STRBuyOrder
Public ID As Integer
Public CustomerID As Integer 'کد مشتری
Public UserID As Integer 'کد کاربر صادر کننده فاکتور
Public DateM As Date 'تاریخ به فرم میلادی
Public Discount As Double 'تخفیف
Public Keraye As Double 'کرایه حمل
Public Sum As Double 'جمع کل فاکتور
Public PriceType As ENOrederBuyPriceType 'مشخص کردن نوع فروش : مشتری عادی ، درجه یک شهرستان و . . .
Public Description As String
Public Arr() As STRFactor 'آرایه ای از اقلام فاکتور
Public Type As EnumOrderSellType 'نوع فاکتور 1=فاکتور عادی 2=فاکتور م خ 10=فاکتور حذف شد
End Structure
حالا باید جیکار کنم ؟؟؟
سلام
احتمالاً ساختار یا کلاسس STRFactor شما مشکل دارد و غیر قابل سریالی شدن است. ساختار STRFactor را نیز اینجا بگذارید.
ممنون از جوابتنقل قول:
ساختارش مشابه STRBuyOrder هست که تو پست قبلی دادم فقط مشکلش تو سربالایز کردن آرایه است یعنی اگه بخوام همون STRBuyOrder رو در نظر بگیرم آرایه ( Public Arr() As STRFactor 'آرایه ای از اقلام فاکتور
) رو سریالایز نمیکنه
میخوام حتی الامکان این کار رو با کد نویسی انجام ندم چون ساختارهام زیادن و اگه بخوام کد بنویسم حداقل 1000 خطی میشه که ارزشش رو دیگه نداره
سریالایز کردن دودویی رو تست نکردم شاید اینطوری بشه !
سلام
من با اینکه اطمینان داشتم، باز تست کردم، هیچ مشکلی مشاهده نکردم.
- مجدداً تست کنید.کد:Public Structure Type1
Public Int As Integer
Public Str As String
End Structure
Public Structure Type2
Public Int As Integer
Public Str As String
Public Arr() As Type1
Public Shared Function Load(ByVal filename As String) As Type2
Using file As New System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)
Return Load(file)
End Using
End Function
Public Shared Function Load(ByVal stream As System.IO.Stream) As Type2
Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(Type2))
Return DirectCast(serializer.Deserialize(stream), Type2)
End Function
Public Sub Save(ByVal filename As String)
Using file As New System.IO.FileStream(filename, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write)
Me.Save(file)
End Using
End Sub
Public Sub Save(ByVal stream As System.IO.Stream)
Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(Type2))
serializer.Serialize(stream, Me)
End Sub
End Structure
'---Test---
Dim x As New Type2
x.Int = 999
x.Str = "Mahdi"
x.Arr = New Type1(1) {}
x.Arr(0).Int = 63
x.Arr(0).Str = "Ali"
x.Arr(1).Int = 57
x.Arr(1).Str = "Hossein"
x.Save("c:\file.xml")
Dim y As Type2 = Type2.Load("c:\file.xml")
- متن کامل خطا را اینجا بنویسید
- ترجیحاً ساختار STRFactor را هم بنویسید.
XmlSerializer در این مورد مشکلی ندارد ولی برای سریال سازی باینری باید از کلاسس زیر استفاده کنید. (البته اگر نمیدانستید!)نقل قول:
سریالایز کردن دودویی رو تست نکردم شاید اینطوری بشه !
System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter
سلام استادنقل قول:
ممنون از راهنماییت
فهمیدم مشکل کار کجاست ولی نمیدونم چطور رفعش کنم !
این استراکچر فاکتور و ملحقاتش :
کد:<Serializable()> Public Structure STRBuyOrder
Public ID As Integer
Public CustomerID As Integer 'کد مشتری
Public UserID As Integer 'کد کاربر صادر کننده فاکتور
Public DateM As Date 'تاریخ به فرم میلادی
Public Discount As Double 'تخفیف
Public Keraye As Double 'کرایه حمل
Public Sum As Double 'جمع کل فاکتور
Public Description As String
Public Arr() As STRFactor 'آرایه ای از اقلام فاکتور
<NonSerialized()> Public PriceType As ENOrederBuyPriceType 'مشخص کردن نوع فروش : مشتری عادی ، درجه یک شهرستان و . . .
<NonSerialized()> Public Type As EnumOrderSellType 'نوع فاکتور 1=فاکتور عادی 2=فاکتور م خ 10=فاکتور حذف شد
End Structure
Public Enum ENOrederBuyPriceType
AkharinKharid = 1
AkharinKharidAzMoshtari = 2
Jozi = 3
Koli = 4
End Enum
Public Enum EnumOrderSellType As Short
Deleted= 10
Normal = 1
End Enum
حالا وقتی میام و این استراکجر رو سریالایز میکنم با این خطا مواجه میشم :
حالا اگه قبل از اینکه سریالایز کردن شروع بشه از On error resume next استفاده کنم . سریالایز انجام میشه ولی دو تا Enum آخری رو سریالایز نمیکنه که ظاهرا مشکل از اوناست !!!کد:There was an error generating the XML document.
System.InvalidOperationException was unhandled
Message="There was an error generating the XML document."
Source="System.Xml"
StackTrace:
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o) at Hesabdari.FRMMain.Button2_Click(Object sender, EventArgs e) in E:\Hosein\project\Hesabdari\Hesabdari\main_forms & classes\FRMMain.vb:line 433 at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Form.ShowDialog(IWin32Window owner) at System.Windows.Forms.Form.ShowDialog() at Hesabdari.FRMUser_Enter.BtnEnter_Click(Object sender, EventArgs e) in E:\Hosein\project\Hesabdari\Hesabdari\main_forms & classes\FRMUser_Enter.vb:line 12 at Hesabdari.FRMUser_Enter.TXTPassword_KeyPress(Object sender, KeyPressEventArgs e) in E:\Hosein\project\Hesabdari\Hesabdari\main_forms & classes\FRMUser_Enter.vb:line 29 at System.Windows.Forms.Control.OnKeyPress(KeyPressEventArgs e) at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m) at System.Windows.Forms.Control.ProcessKeyMessage(Message& m) at System.Windows.Forms.Control.WmKeyChar(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.TextBoxBase.WndProc(Message& m) at System.Windows.Forms.TextBox.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(ApplicationContext context) at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) at Hesabdari.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args) at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel) at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData) at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.InvalidOperationException
Message="Instance validation error: '0' is not a valid value for Hesabdari.ENOrederBuyPriceType."
Source="-zrrnde2"
StackTrace:
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterSTRBuyOrder.Write3_ENOrederBuyPriceType(ENOrederBuyPriceType v) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterSTRBuyOrder.Write5_STRBuyOrder(String n, String ns, STRBuyOrder o, Boolean needType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterSTRBuyOrder.Write6_STRBuyOrder(Object o)
InnerException:
حالا اگه بیام و نوع اون دو تا رو هم بکنم Int مشکل رفع میشه !
ولی اگه نخوام این کار رو بکنم چی ؟ راه دیگه ای هست ؟؟
درست شد !!!
اینم راهش :
کد:http://geekswithblogs.net/claeyskurt/archive/2006/07/19/85667.aspx
کد:<Flags()> _
Public Enum TestEnumType
<Xml.Serialization.XmlEnum("1")> Suds = 1
<Xml.Serialization.XmlEnum("2")> Soda = 2
<Xml.Serialization.XmlEnum("4")> Beer = 4
End Enum
سلام
مشکلتان به ظاهر حل شده ولی اجازه دهید مطالبی چند بیان کنم...
مشکل از آنجا است که Enum های شما ورودی برای مقدار صفر ندارد در حالی که متغییر های مقدار دهی نشده اند و صفر هستند.
شما باید اول تکلیف خود را روشن کنید.
مقادیر Enum شما میتواند صفر باشد یا نمیتواند؟
اگر صفر بودن مجاز است که ساختارهای را چنین اصلاح کنید:
اگر صفر بودن مجاز نیست خوب چرا مقدار دو متغییر شما باید صفر باشد؟کد:Public Enum ENOrederBuyPriceType
None = 0
AkharinKharid = 1
AkharinKharidAzMoshtari = 2
Jozi = 3
Koli = 4
End Enum
Public Enum EnumOrderSellType As Short
None = 0
Deleted= 10
Normal = 1
End Enum
مقدار PriceType و Type را صراحتاً به مقداری مجاز از محدوده مجاز Enum ست کنید.
=====
ضمناً خصوصیت System.Serializable و System.NonSerialized در کار XmlSerializer بی تاثیر هستند و بود و نبودشان فرقی نمیکند، این صفات در BinaryFormatter و سایر مشتقاتش استفاده میشوند.
پیروز باشید.