简体   繁体   English

如何使用protobuf-net进行xml序列化?

[英]How to use protobuf-net for xml-serialization?

Maybe i misunderstood something for serialization. 也许我误解了一些要序列化的东西。 i wanna serialize my .net object fastest way. 我想以最快的方式序列化.net对象。 i made some googling i found protobuf. 我做了一些谷歌搜索,找到了protobuf。 Myfirstquestion is ProtoBuf.Net has avility for xml serailization.if it has, can i use it for xml serialization. 我的第一个问题是ProtoBuf.Net具有用于xml序列化的功能。如果有,我可以将其用于xml序列化。

My model: 我的模特:


    [XmlType]
public class CT {
    [XmlElement(Order = 1)]
    public int Foo { get; set; }
}
[XmlType]
public class TE {
    [XmlElement(Order = 1)]
    public int Bar { get; set; }
}
[XmlType]
public class TD {
    [XmlElement(Order = 1)]
    public List CTs { get; set; }
    [XmlElement(Order = 2)]
    public List TEs { get; set; }
    [XmlElement(Order = 3)]
    public string Code { get; set; }
    [XmlElement(Order = 4)]
    public string Message { get; set; }
    [XmlElement(Order = 5)]
    public DateTime StartDate { get; set; }
    [XmlElement(Order = 6)]
    public DateTime EndDate { get; set; }
}

my serializer : 我的序列化器:

            CT ct = new CT() { Foo = 1 };
        List<CT> list = new List<CT>();
        list.Add(ct);
        TE te = new TE() { Bar = 2 };
        List<TE> list2 = new List<TE>();
        list2.Add(te);
        TD td = new TD() { Code = "Test",Message = "Yusuf",StartDate = DateTime.Now,EndDate = DateTime.Now,CTs = list,TEs = list2 };
        List<TD> list3 = new List<TD>();
        list3.Add(td);
        Stopwatch stopwatch5 = new Stopwatch();
        stopwatch5.Start();

        string str = String.Empty;
             using (MemoryStream stream = new MemoryStream()) 
        {
            byte[] data =  Serialize(list3);
            XmlDocument doc = new XmlDocument();
            string xml = Encoding.UTF8.GetString(data); <--SHOULD CREATE XML
            doc.LoadXml(xml);
           // str = Convert.ToBase64String(stream.GetBuffer(),0,(int)stream.Length); 
        } 
        stopwatch5.Stop();
        Console.WriteLine(((double)(stopwatch5.Elapsed.TotalMilliseconds * 1000000) / 1000000).ToString("0.00 ns"));
        Console.Read();

    }
    public static byte[] Serialize(List<TD> tData) {
        using(var ms = new MemoryStream()) {
            ProtoBuf.Serializer.Serialize(ms,tData);
            return ms.ToArray();
        }
    }

    public static List<TD> Deserialize(byte[] tData) {
        using(var ms = new MemoryStream(tData)) {
            return ProtoBuf.Serializer.Deserialize<List<TD>>(ms);
        }
    }

it should create xml as a result of " string xml = Encoding.UTF8.GetString(data);". 它应作为“ string xml = Encoding.UTF8.GetString(data);”的结果创建xml。 But doesn't. 但是不是。 How can i produxe xml result? 我如何产生xml结果?

Protocol buffers doesn't serialize objects to XML. 协议缓冲区不会将对象序列化为XML。
It produces binary data. 它产生二进制数据。 And it has its own set of attributes. 它具有自己的一组属性。
Check this answer 检查这个答案

Is Protobuf-net's serialization/deserialization faster than XML ? Protobuf-net的序列化/反序列化是否比XML快? Yes, by far . 是的, 到目前为止
However XmlSerializer is fast enough for most of the tasks. 但是XmlSerializer对于大多数任务来说足够快 What you should remind when using it though, is: 使用时应提醒的是:

  • XmlSerializer instance is generating code on the fly and compile this code into an assembly. XmlSerializer实例正在动态生成代码,并将此代码编译为程序集。
  • This generated assembly is then used to serialize and deserialize your objects really fast. 然后,使用此生成的程序集非常快速地序列化和反序列化对象。
  • So you should cache instances of XmlSerializer (and avoid recreating them) 因此,您应该缓存XmlSerializer的实例(并避免重新创建它们)
  • you could add a warm up by calling Serialize and Deserialize in order to initialize inner objects and jit them. 您可以通过调用Serialize和Deserialize进行初始化,以初始化内部对象并进行初始化。

You could even go further by generating the auto-generated assembly by yourself, but then you should remember to regenerate each time you change the objects (It can be automated with a MsBuild Task). 您甚至可以自己生成自动生成的程序集,从而走得更远,但是随后您应该记住每次更改对象时都要重新生成(可以通过MsBuild Task自动生成)。 You can also look further optimizations: 您还可以查看进一步的优化:

You can only have one tag at the root level of your xml. 您只能在xml的根级别使用一个标签。 So either TD cannot be a list, or you must have an outer tag around the List. 因此,TD不能是列表,或者您必须在列表周围有一个外部标记。 This code works 此代码有效

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TD td = new TD()
            {
                Code = "Test",
                Message = "Yusuf",
                StartDate = DateTime.Now,
                EndDate = DateTime.Now,
                CTs = new List<CT>() {
                    new CT() { Foo = 1},
                    new CT() { Foo = 2},
                    new CT() { Foo = 3},
                },
                TEs = new List<TE>() {
                    new TE() { Bar = 1},
                    new TE() { Bar = 2},
                    new TE() { Bar = 3},
                }
            };

           using (MemoryStream stream = new MemoryStream()) 
            {
                byte[] data =  Serialize(td);
                XmlDocument doc = new XmlDocument();
                string xml = Encoding.UTF8.GetString(data); 
                doc.LoadXml(xml);
               // str = Convert.ToBase64String(stream.GetBuffer(),0,(int)stream.Length); 
            } 

        }
        public static byte[] Serialize(TD tData)
        {
            using (var ms = new MemoryStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(TD));
                serializer.Serialize(ms, tData);
                return ms.ToArray();
            }
        }

        public static TD Deserialize(byte[] tData)
        {
            using (var ms = new MemoryStream(tData))
            {
                XmlSerializer xs = new XmlSerializer(typeof(TD));
                return (TD)xs.Deserialize(ms);
            }
        }
    }
    [XmlRoot("CT")]
    public class CT
    {
        [XmlElement(ElementName = "Foo", Order = 1)]
        public int Foo { get; set; }
    }
    [XmlRoot("TE")]
    public class TE
    {
        [XmlElement(ElementName = "Bar", Order = 1)]
        public int Bar { get; set; }
    }
    [XmlRoot("TD")]
    public class TD
    {
        [XmlElement(ElementName = "CTs",  Order = 1)]
        public List<CT> CTs { get; set; }
        [XmlElement(ElementName = "TEs", Order = 2)]
        public List<TE> TEs { get; set; }
        [XmlElement(ElementName = "Code", Order = 3)]
        public string Code { get; set; }
        [XmlElement(ElementName = "Message", Order = 4)]
        public string Message { get; set; }
        [XmlElement(ElementName = "StartDate", Order = 5)]
        public DateTime StartDate { get; set; }
        [XmlElement(ElementName = "EndDate", Order = 6)]
        public DateTime EndDate { get; set; }
    }
}
​

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM