In .Net / C # - OnSerializing event fired for XmlSerializer.Serialize

I want to set some attributes just before the object is serialized, but since it can be serialized from multiple locations, is there a way to do this using the OnSerializing method (or similar) to serialize Xml - my class looks a lot like this - but the On methods .. are not called ...:

[Serializable] [XmlRoot(ElementName = "ResponseDetails", IsNullable = false)] public class ResponseDetails { public ResponseDetails() {} [OnSerializing] internal void OnSerializingMethod(StreamingContext context) { logger.Info("Serializing response"); } [OnSerialized] internal void OnSerializedMethod(StreamingContext context) { logger.Info("Serialized response"); } [OnDeserialized] internal void OnDeserializedMethod(StreamingContext context) { logger.Info("Deserialized response"); } [OnDeserializing] internal void OnDeserializingMethod(StreamingContext context) { logger.Info("Deserializing response"); } 
+4
source share
2 answers

No, XmlSerializer does not support this. If you are using .NET 3.0 or later, look at the DataContractSerializer .

+5
source

I tried to break the ice. Please look. Create a class called MyXMLSerializer as follows:

 public class MyXMLSerializer { delegate void del_xmlSerializing(); del_xmlSerializing ds; delegate void del_xmlSerialized(System.IO.Stream stream, object o); AsyncCallback cb; del_xmlSerialized dd; delegate void del_xmlDeserializing(); del_xmlDeserializing dx; delegate object del_xmlDeserialized(System.IO.Stream stream); AsyncCallback db; del_xmlDeserialized xd; object FinalDeserializedObject = null; public MyXMLSerializer() { } public void Serialize(System.IO.Stream stream,object o,Type ClassType) { XmlSerializer xx = new XmlSerializer(ClassType); /* ON Serialization Beginning [ONSERIALIZING] */ ds = new del_xmlSerializing(OnXMLSerializing_Begin); IAsyncResult IAR_Begin = ds.BeginInvoke(null, null); ds.EndInvoke(IAR_Begin); /* ON Serialization Beginning [ONSERIALIZING] */ /* ON Serialization Completed ie [ONSERIALIZED] */ dd = new del_xmlSerialized(xx.Serialize); cb = new AsyncCallback(OnXMLSerializing_Completed); IAsyncResult IAR = dd.BeginInvoke(stream, o, cb, dd); // This Delay Is Important Otherwise The Next Line Of Code(From Where Serialize Is Called) // Gets Executed Prior To Conclusion Of EndInvoke, Consequently Throwing Exception. while (IAR.IsCompleted == false) Thread.Sleep(1); /* ON Serialization Completed ie [ONSERIALIZED] */ } public object Deserialize(System.IO.Stream stream,Type ClassType) { XmlSerializer xx = new XmlSerializer(ClassType); /* ON De-Serialization Beginning [ONDESERIALIZING] */ dx = new del_xmlDeserializing(OnXMLDeserializing_Begin); IAsyncResult IAR_Begin = dx.BeginInvoke(null, null); dx.EndInvoke(IAR_Begin); /* ON De-Serialization Beginning [ONDESERIALIZING] */ /* ON De-Serialization Completed [ONDESERIALIZED] */ xd = new del_xmlDeserialized(xx.Deserialize); db = new AsyncCallback(OnXMLDeserialization_Completed); IAsyncResult IAR = xd.BeginInvoke(stream, db, xd); // This Delay Is Important Otherwise The Next Line Of Code(From Where Serialize Is Called) // Gets Executed Prior To Conclusion Of EndInvoke ,Consequently Throwing Exception. while (IAR.IsCompleted == false) Thread.Sleep(1); return FinalDeserializedObject; /* ON De-Serialization Completed [ONDESERIALIZED] */ } private void OnXMLDeserialization_Completed(IAsyncResult I) { del_xmlDeserialized Clone = (del_xmlDeserialized)I.AsyncState; FinalDeserializedObject = Clone.EndInvoke(I); OnDeserialized(); } public virtual void OnSerialized() { MessageBox.Show("Serialization Completed"); } public virtual void OnDeserialized() { MessageBox.Show("Deserialization Completed"); } private void OnXMLSerializing_Completed(IAsyncResult I) { del_xmlSerialized Clone = (del_xmlSerialized)I.AsyncState; Clone.EndInvoke(I); OnSerialized(); } private void OnXMLDeserializing_Begin() { //Thread.Sleep(5000); OnDeserializing(); } public virtual void OnDeserializing() { MessageBox.Show("Beginning Deserialization"); } private void OnXMLSerializing_Begin() { //Thread.Sleep(5000); OnSerializing(); } public virtual void OnSerializing() { MessageBox.Show("Beginning Serialization"); } } 

Now create another class called TotalRecall and inherit the MyXMLSerializer class into this class as follows:

 public class TotalRecall:MyXMLSerializer { public override void OnSerialized() { MessageBox.Show("Yippeeee!!!!!,I Finally Managed To Wire [ONSERIALIZED] Event With XMLSerializer.My Code Upon XML Serialized[ONSERIALIZED] Goes Here.."); //base.OnSerialized(); } public override void OnSerializing() { MessageBox.Show("Yippeeee!!!!!,I Finally Managed To Wire [ONSERIALIZING] Event With XMLSerializer.My Code Upon XML Serializing[ONSERIALIZING] Goes Here.."); //base.OnSerializing(); } public override void OnDeserializing() { MessageBox.Show("Yes!!!!!,I Finally Managed To Wire [ONDESERIALIZING] Event With XMLSerializer.My Code Upon XML De-Serializing[ONDESERIALIZING] Goes Here.."); //base.OnDeserializing(); } public override void OnDeserialized() { MessageBox.Show("Yes!!!!!,I Finally Managed To Wire [ONDESERIALIZED] Event With XMLSerializer.My Code Upon XML De-Serialized[ONDESERIALIZED] Goes Here.."); //base.OnDeserialized(); } } 

Now create a form (I created a Windows form). Create two buttons on it with the names Button1 and Button2 (by default). My full form code:

 public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { TotalRecall xx = new TotalRecall(); Employee ee = new Employee(); FileStream fs = File.Create("sss.xml"); xx.Serialize(fs, ee, typeof(Employee)); fs.Close(); fs.Dispose(); } private void button2_Click(object sender, EventArgs e) { TotalRecall xx = new TotalRecall(); FileStream fs=File.OpenRead("sss.xml"); Employee ee = (Employee)xx.Deserialize(fs, typeof(Employee)); fs.Close(); fs.Dispose(); } } 

Please indicate namespaces wherever I skip this copy.

+2
source

Source: https://habr.com/ru/post/1277717/


All Articles