2

私はMonoを試しました-それは1ミリ秒でシリアライザーを作成しますが、.NET4.0では60です。誰かがMonoシリアライザージェネレーターを再利用可能なlibとして移植したのでしょうか?または、移植しようとする場合に使用するモノラルアセンブリの正確なリストを教えてもらえますか?


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を参照してください。「monoserialization.exe」を使用してオブジェクトの汎用リストでテストを実行し、.NETシリアル化と移植されたMonoシリアル化でマウスクリック実行します。移植されたバージョンでは、.NETよりも最大10倍高速なデフォルトのシリアライザーの生成が可能です。

編集

XMLシリアル化構成.NET4.5(http://msdn.microsoft.com/en-us/library/ms229754.aspx)に関してMSDNで見つかりました:

useLegacySerializationGeneration XmlSerializerが、ファイルにC#コードを書き込んでからアセンブリにコンパイルすることにより、アセンブリを生成するレガシーシリアル化生成を使用するかどうかを指定します。デフォルトはfalseです。

4

2 に答える 2

2

.NET3.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を試してシリアライザーをコンパイルするのは興味深いかもしれません。

編集

モノトランクに行くことができるいくつかのテストを追加しました。ポートのみに関連するすべての変更は、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;
    }
}

EDIT2

タイプAの1つのオブジェクトをシリアル化し、その文字列からタイプBの他のオブジェクトを逆シリアル化しようとすると、次のようになります。

  • .NETはInvalidOperationExceptionをスローします。
  • MonoはXmlExceptionをスローします。
于 2012-10-29T08:49:31.200 に答える
0

モノは本当に速くはありません。違います。

Monoは、リフレクションを介してxmlのシリアル化/逆シリアル化を実行することから開始し(したがって、シリアライザーのインスタンス化は高速ですが、実際には低速です)、その後、バックグラウンドで高速シリアル化のための一時アセンブリの生成を実行するようです。

私がそれで遊んだことから、monoは一般的に一時的なアセンブリの作成にも失敗します。これは、シリアル化/逆シリアル化が常に標準の.NETよりも大幅に遅くなることを意味します。

于 2013-03-28T15:09:58.773 に答える