Newtonsoft.json: ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”

์— ๋งŒ๋“  2017๋…„ 07์›” 18์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JamesNK/Newtonsoft.Json

์ด๊ฒƒ์ด ๋ฒ„๊ทธ์ธ์ง€ ์•„๋‹ˆ๋ฉด ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒƒ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•œ ๋ฒˆ์€ .Net ํ”„๋ ˆ์ž„์›Œํฌ์—, ํ•œ ๋ฒˆ์€ UWP ํ”„๋ ˆ์ž„์›Œํฌ์— "Type" ์œ ํ˜•์˜ ์†์„ฑ์ด ์žˆ๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜•์‹์€ ํ˜•์‹์˜ AssemblyQualifiedName ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ .Net ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ง๋ ฌํ™”ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
"System.EventArgs, mscorlib, ๋ฒ„์ „=4.0.0.0, ๋ฌธํ™”๊ถŒ=์ค‘๋ฆฝ, PublicKeyToken=b77a5c561934e089"

JsonConver.DeserializeObject๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UWP ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด๊ฒƒ์„ ์—ญ์ง๋ ฌํ™”ํ•˜๋ฉด ์ ์ ˆํ•œ Type ๊ฐœ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ UWP์—์„œ ์ง๋ ฌํ™”ํ•˜๋ฉด ๋‹ค์Œ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
"System.EventArgs, System.Private.CoreLib, ๋ฒ„์ „ = 4.0.0.0, ๋ฌธํ™” = ์ค‘๋ฆฝ, PublicKeyToken = 7cec85d7bea7798e"

.Net ํ”„๋ ˆ์ž„์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๊ฒƒ์„ ์—ญ์ง๋ ฌํ™”ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
""System.EventArgs, System.Private.CoreLib, ๋ฒ„์ „ = 4.0.0.0, ๋ฌธํ™” = ์ค‘๋ฆฝ, PublicKeyToken = 7cec85d7bea7798e" ๊ฐ’์„ 'System.Type' ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค."

๋ฉ”์‹œ์ง€๋Š” ๋‚˜์—๊ฒŒ ๋ช…ํ™•ํ•˜์ง€๋งŒ ์™œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ UWP ๋ฒ„์ „์ด ๋” ์ตœ์‹ ์ด๊ณ  ์ด ๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์‚ฌ์šฉ์ž ์ง€์ • ISerializationBinder๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜๋˜์ง€ ์•Š๋Š” ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ๊ฒฝ์šฐ
๋ฆฌ๋””๋ ‰์…˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ์˜์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค).

RedirectAssembly("System.Private.CoreLib", "mscorlib");

public static void RedirectAssembly(string fromAssemblyShotName, string replacmentAssemblyShortName)
{
    Console.WriteLine($"Adding custom resolver redirect rule form:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
    ResolveEventHandler handler = null;
    handler = (sender, args) =>
    {
        // Use latest strong name & version when trying to load SDK assemblies
        var requestedAssembly = new AssemblyName(args.Name);
        Console.WriteLine($"RedirectAssembly >  requesting:{requestedAssembly}; replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
        if (requestedAssembly.Name == fromAssemblyShotName)
        {
            try
            {
                Console.WriteLine($"Redirecting Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
                var replacmentAssembly = Assembly.Load(replacmentAssemblyShortName);
                return replacmentAssembly;
            }
            catch (Exception e)
            {
                Console.WriteLine($"ERROR while trying to provide replacement Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
                Console.WriteLine(e);
                return null;
            }
        }

        Console.WriteLine($"Framework faild to find {requestedAssembly}, trying to provide replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");

        return null;
    };

    AppDomain.CurrentDomain.AssemblyResolve += handler;
}

๋ชจ๋“  3 ๋Œ“๊ธ€

์œ ํ˜• ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ–‰ํžˆ๋„ ๋งค์šฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. https://apisof.net/catalog/System.EventArgs ๋ฅผ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด System.EventArgs ๊ฐ€ ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์–ด์…ˆ๋ธ”๋ฆฌ์— ์ •์˜๋˜์–ด ์žˆ๊ณ  ๊ทธ ์ค‘ ์ผ๋ถ€๊ฐ€ System.Private.CoreLib ์™€ ๊ฐ™์€ ๊ฐœ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์— ํ˜•์‹ ์ „๋‹ฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "System.EventArgs, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" ๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ๋ชจ๋“  ์œ ํ˜•์„ UWP์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ํ˜•์‹ ์ „๋‹ฌํ•˜๋Š” mscorlib ํŒŒ์‚ฌ๋“œ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์‹œ์Šคํ…œ ์œ ํ˜• ์ด๋ฆ„์„ ๋Ÿฐํƒ€์ž„ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์œ ํ˜•์— ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  SerializationBinder ๊ฐ€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์œ ํ•œ ISerializationBinder๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ ์œ ํ˜• ์ด๋ฆ„์˜ ์ƒ์„ฑ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ISerializationBinder๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜๋˜์ง€ ์•Š๋Š” ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ๊ฒฝ์šฐ
๋ฆฌ๋””๋ ‰์…˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ์˜์ง€๋Š” ์•Š์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค).

RedirectAssembly("System.Private.CoreLib", "mscorlib");

public static void RedirectAssembly(string fromAssemblyShotName, string replacmentAssemblyShortName)
{
    Console.WriteLine($"Adding custom resolver redirect rule form:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
    ResolveEventHandler handler = null;
    handler = (sender, args) =>
    {
        // Use latest strong name & version when trying to load SDK assemblies
        var requestedAssembly = new AssemblyName(args.Name);
        Console.WriteLine($"RedirectAssembly >  requesting:{requestedAssembly}; replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
        if (requestedAssembly.Name == fromAssemblyShotName)
        {
            try
            {
                Console.WriteLine($"Redirecting Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
                var replacmentAssembly = Assembly.Load(replacmentAssemblyShortName);
                return replacmentAssembly;
            }
            catch (Exception e)
            {
                Console.WriteLine($"ERROR while trying to provide replacement Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
                Console.WriteLine(e);
                return null;
            }
        }

        Console.WriteLine($"Framework faild to find {requestedAssembly}, trying to provide replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");

        return null;
    };

    AppDomain.CurrentDomain.AssemblyResolve += handler;
}
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰