2

我尝试了 Mono - 它在 1 毫秒内创建序列化程序,而 .NET 4.0 则为 60。可能有人将 Mono 序列化程序生成器移植为可重用的库?或者如果我尝试移植,可以给我要使用的 Mono 程序集的确切列表吗?


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

namespace serialization
{
    [Serializable]
    public sealed class UserCredentials1
    {
        public string Username { get; set; }
        public string Password { get; set; }

        public override string ToString()
        {
            return string.Format("Username: {0}, Password: {1}", Username, Password);
        }
    }

    [Serializable]
    public sealed class UserCredentials2
    {
        public string Username { get; set; }
        public string Password { get; set; }

        public override string ToString()
        {
            return string.Format("Username: {0}, Password: {1}", Username, Password);
        }
    }

    //.NET 4.0
    //native=60.757
    //compiled=2.2602
    //Username: CTTTOM, Password: WoEIPX6Qqf11j9vKn01bAA==

    //MONO:
    //mono serialization.exe
    //native=0.1589
    //compiled=0.1337
    //Username: CTTTOM, Password: WoEIPX6Qqf11j9vKn01bAA==

    class Program
    {
        static void Main(string[] args)
        {
            string xml1 = @"      " +
             @" CTTTOM" +
        @" WoEIPX6Qqf11j9vKn01bAA==" +
                 @"";

            string xml2 = @"" +
@" CTTTOM" +
@" WoEIPX6Qqf11j9vKn01bAA==" +
     @"";

            //warm up
            Type targetType1 = typeof(UserCredentials1);
            XmlSerializer nativeSerializer1 = new XmlSerializer(targetType1);
            Type targetType2 = typeof(UserCredentials2);
            nativeSerializer1.Deserialize(new XmlTextReader(new StringReader(xml1)));

            var native = new Stopwatch();
            native.Start();
            XmlSerializer nativeSerializer2 = new XmlSerializer(targetType2);
            native.Stop();
            Console.WriteLine("native=" + native.Elapsed.TotalMilliseconds);

            var compiled = new Stopwatch();
            compiled.Start();
            var de = nativeSerializer2.Deserialize(new XmlTextReader(new StringReader(xml2)));
            compiled.Stop();
            Console.WriteLine("compiled=" + compiled.Elapsed.TotalMilliseconds);
            Console.Write(de.ToString());
            Console.ReadKey();
        }
    }
}

编辑

我迈出了迁移的第一步,请参阅https://github.com/asd-and-Rizzo/mono。使用“mono serialization.exe”对通用对象列表进行测试,单击鼠标运行 .NET 序列化和移植的 Mono 序列化。移植版本的默认序列化程序生成速度比 .NET 快约 10 倍。

编辑

在 MSDN 中找到关于 XML 序列化配置 .NET 4.5 (http://msdn.microsoft.com/en-us/library/ms229754.aspx):

useLegacySerializationGeneration 指定 XmlSerializer 是否使用遗留序列化生成,通过将 C# 代码写入文件然后将其编译为程序集来生成程序集。默认值为假。

4

2 回答 2

2

制作了可以针对 .NET 3.5 构建和使用的端口。


extern alias mono;
using XmlSerializer = mono::System.Xml.Serialization.XmlSerializer;

https://github.com/asd-and-Rizzo/mono/blob/master/mcs/class/System.XML/Mono.Xml.Serialization.sln

Mono 不编译序列化程序。

尝试托管 Mono.CSharp.dll 来编译序列化程序可能会很有趣。

编辑

我添加了几个测试可以转到 Mono 主干。我所有与端口相关的更改都在 EXTEND_EMBRACE_XMLSER 编译符号下。

我们的产品测试指出 Mono 序列化和反序列化 .NET 不序列化和反序列化。对于我们的情况来说甚至更好,如果预期错误,蝙蝠可能会成为其他人的问题。所有测试都提交给 System.Xml 测试。

public class HardlySerializableObject
{
    private HardlySerializableObject() { }

    public HardlySerializableObject(object value) { }

    public string Property1 { get { return "^_^"; } }

    public int Property2 { get; private set; }

    public static HardlySerializableObject Create()
    {
        return new HardlySerializableObject("any");
    }

    protected bool Equals(HardlySerializableObject other)
    {
        return Property2 == other.Property2 && Property1 == other.Property1;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((HardlySerializableObject)obj);
    }

    public override int GetHashCode()
    {
        return Property2;
    }
}

编辑2

何时序列化 A 类型的一个对象并尝试从该字符串反序列化 B 类型的其他对象然后:

  • .NET 引发 InvalidOperationException。
  • Mono 抛出 XmlException。
于 2012-10-29T08:49:31.200 回答
0

单声道并不是真的更快。那不一样。

似乎 Mono 首先通过反射进行 xml 序列化/反序列化(因此实例化序列化程序很快,但实际上用它进行序列化很慢),然后它生成临时程序集以在后台快速序列化。

从我的使用来看,单声道通常也无法创建临时程序集。这意味着您的序列化/反序列化将始终比标准的 .NET 慢得多。

于 2013-03-28T15:09:58.773 回答