Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating MTOM and Deserializing it

I have been using some code to create MTOM by using code from MSDN.

It seems that there is an error and I cannot understand where the problem lies as one of the users on the forum pointed out that there is an error.

The file (JPEG) data get corrupted after a de-serialization. The complete code is listed below.

 public class Post_7cb0ff86_5fe1_4266_afac_bcb91eaca5ec
            {
                [DataContract()]
                public partial class TestAttachment
                {
                    private byte[] fileField;
                    private string filenameField;

                    [DataMember()]
                    public byte[] File
                    {
                        get
                        {
                            return this.fileField;
                        }
                        set
                        {
                            this.fileField = value;
                        }
                    }
                    [DataMember()]
                    public string Filename
                    {
                        get
                        {
                            return this.filenameField;
                        }
                        set
                        {
                            this.filenameField = value;
                        }
                    }
                }
                public static void Test()
                {
                    string Filename = "Image.jpg";
                byte[] file = File.ReadAllBytes(Filename);

                TestAttachment Attachment = new TestAttachment();
                Attachment.Filename = Filename;
                Attachment.File = file;
                MemoryStream MTOMInMemory = new MemoryStream();
                XmlDictionaryWriter TW = XmlDictionaryWriter.CreateMtomWriter(MTOMInMemory, Encoding.UTF8, Int32.MaxValue, "");
                DataContractSerializer DCS = new DataContractSerializer(Attachment.GetType());
                DCS.WriteObject(TW, Attachment);
                TW.Flush();
                Console.WriteLine(Encoding.UTF8.GetString(MTOMInMemory.ToArray()));
                var v = DeserializeMTOMMessage(Encoding.UTF8.GetString(MTOMInMemory.ToArray()));
                File.WriteAllBytes(v.Filename,v.File);
                }

                public static TestAttachment DeserializeMTOMMessage(string MTOMMessage)
                {

                    try
                    {

                        MemoryStream MTOMMessageInMemory = new MemoryStream(UTF8Encoding.UTF8.GetBytes(MTOMMessage));

                        XmlDictionaryReader TR = XmlDictionaryReader.CreateMtomReader(MTOMMessageInMemory, Encoding.UTF8, XmlDictionaryReaderQuotas.Max);

                        DataContractSerializer DCS = new DataContractSerializer(typeof(TestAttachment));

                        return (TestAttachment)DCS.ReadObject(TR);

                    }
                    catch
                    {

                        return null;

                    }

                }
            }

I would be grateful if someone can help me in pointing out where the problem is. I am new to XOP/MTOM and find it hard to track down where the error might be. Either serialization or de-serialization.

Thank you


1 Answers

There's a bug in your code. Change your method call

MTOMInMemory.Position = 0;
DeserializeMTOMMessage(Encoding.UTF8.GetString(MTOMInMemory.ToArray()));

to

DeserializeMTOMMessage(MTOMInMemory.ToArray())

and the implementation to

 public static TestAttachment DeserializeMTOMMessage(byte[] MTOMMessage) 
    { 
        try 
        { 
            MemoryStream MTOMMessageInMemory = new MemoryStream(MTOMMessage);
            XmlDictionaryReader TR = XmlDictionaryReader.CreateMtomReader(MTOMMessageInMemory, Encoding.UTF8, XmlDictionaryReaderQuotas.Max); 
            DataContractSerializer DCS = new DataContractSerializer(typeof(TestAttachment)); 
            return (TestAttachment)DCS.ReadObject(TR); 
        } 
        catch
        {

            return null;
        } 
    } 

what you've done was some double conversion from utf8 to byte array and vice versa, which ended up creating not the original byte array you were using

like image 173
YavgenyP Avatar answered Sep 04 '26 00:09

YavgenyP



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!