

Decimal値をシリアライズしてデシリアライズしたらDouble値が返ってきます。
解決するにはResolver,Formatter,IJsonFormatterResolver,IJsonFormatter<>を使うようですがどのように記述するかわかりません。サンプルや実装例でもよいので解決策をお願いしたいです。

[code]

    using Microsoft.CodeAnalysis.CSharp.Scripting;
    using System;
    using System.Diagnostics;
    using Microsoft.CodeAnalysis.Scripting;
    using System.IO;
    namespace シリアライズテスト {
     public class Program {
         static void Main() {
             const String ファイル名 = @"Json.json";
             var Script = CSharpScript.Create(
                 "0.11111111111111111m",
                 ScriptOptions.Default.AddReferences(typeof(Object).Assembly)
                 .AddImports("System"),
                 typeof(Object)
             );
             var e= Script.CreateDelegate()("");
             e.Wait();
             var input = e.Result;
             using(var f = new FileStream(ファイル名,FileMode.Create)) {
                 Utf8Json.JsonSerializer.Serialize(f,input);
             }
             using(var f = new FileStream(ファイル名,FileMode.Open)) {
                 var output = Utf8Json.JsonSerializer.Deserialize<Object>(f);
                 Console.WriteLine($"{input.GetType()} {input}");
                 Console.WriteLine($"{output.GetType()} {output}");
                 Debug.Assert(input.GetType()==typeof(Decimal));
                 Debug.Assert(output.GetType()==typeof(Decimal));//error output.GetType()==typeof(Double)
             }
             Console.ReadKey();
         }
     }
    }
    
[/code]


CC BY-SA 4.0
2020-11-25T12:12:55.513
72202
2020-11-25T14:09:40.577
2020-11-25T12:55:33.490
3060
9243
question
c# json .net-core
C# .net coreでのUtf8JsonのDecimalのserialize,desirialize


こちらのテストプログラムが参考になるでしょう。  
[Utf8Json/tests/Utf8Json.Tests/DecimalTest.cs](https://github.com/neuecc/Utf8Json/blob/608cf01589cb3feb225a6e51a2324a24466fdaa6/tests/Utf8Json.Tests/DecimalTest.cs)

>
[code]

>     var d = decimal.MaxValue;
>     var bin = JsonSerializer.Serialize(d);
>     JsonSerializer.Deserialize<decimal>(bin).Is(d);
>  
[/code]

デシリアライズの時に明示的にタイプを指定する必要があると思われます。  
質問のソースで言えば以下の行になるでしょう。

[code]

    var output = Utf8Json.JsonSerializer.Deserialize<Object>(f);
    
[/code]

`<Object>`ではなく`<decimal>`を指定します。

[code]

    var output = Utf8Json.JsonSerializer.Deserialize<decimal>(f);
    
[/code]

同じテストプログラムの記述で、明示的にクラスで変数の型を指定しておけば、それで対応されるようです。

>
[code]

>     public class Foo
>     {
>         public decimal Bar { get; set; }
>         public string More { get; set; }
>     }
>  
>     var foo = JsonSerializer.Serialize(new Foo { Bar = -31.42323m, More =
> "mmmm" });
>     var ddd = JsonSerializer.Deserialize<Foo>(foo);
>     ddd.Bar.Is(-31.42323m);
>     ddd.More.Is("mmmm");
>  
[/code]


CC BY-SA 4.0
2020-11-25T13:59:52.757
72204
2020-11-25T13:59:52.757
26370
72202
answer


ありがとうございました。単純なDecimalではなく、メンバーにDecimalがあった場合どうなるのかわかりませんでしたが、明確に答えてくださり助かりました。  
匿名型で受け取りたいのでジェネリックでダミー引数を受け取ってデシリアライズするコードで確かめました。

[code]

    using Microsoft.CodeAnalysis.CSharp.Scripting;
    using System;
    using System.Diagnostics;
    using Microsoft.CodeAnalysis.Scripting;
    using System.IO;
    namespace シリアライズテスト {
        public class Program {
            const String ファイル名 = @"Json.json";
            static T Desirialize<T>(T dummy) {
                using(var f = new FileStream(ファイル名,FileMode.Open)) {
                    var output = Utf8Json.JsonSerializer.Deserialize<T>(f);
                    return output;
                }
            }
            static void Main() {
                var Script = CSharpScript.Create(
                    "new{a=1m,b=2m}",
                    ScriptOptions.Default.AddReferences(typeof(Object).Assembly)
                    .AddImports("System"),
                    typeof(Object)
                );
                var e = Script.CreateDelegate()("");
                e.Wait();
                var input = e.Result;
                using(var f = new FileStream(ファイル名,FileMode.Create)) {
                    Utf8Json.JsonSerializer.Serialize(f,input);
                }
                var output = Desirialize(new { a = 0m,b = 0m });
                Console.WriteLine($"{input.GetType()} {input}");
                Console.WriteLine($"{output.GetType()} {output}");
                Console.ReadKey();
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-11-25T14:09:40.577
72205
2020-11-25T14:09:40.577
9243
72202
answer