Newtonsoft 직렬화 후 C # InvokeMethod 실패

Hablahat

Type.InvokeMember 메서드 호출을 사용하여 C #에서 동적으로 메서드를 호출하고 있습니다.
두 가지 메서드가 있습니다. 하나는 문자열 인수를 허용하고 다른 하나는 int 인수를 허용합니다.
코드에서 초기화되면 코드가 제대로 작동하지만 Newtonsoft.Json 직렬화 후에는 실패합니다.
유형이 올바른 것처럼 보이기 때문에 디버깅은 도움이되지 않습니다. 다음은 완전한 코드입니다.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace DynamicMethodCall
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Command> commands = new List<Command>()
            {
                new Command() { ClassName="Module1", MethodName="Method1", Parameters= new object[] { "1" } },
                new Command() { ClassName="Module1", MethodName="Method2", Parameters= new object[] { 1 } }
            };

            foreach (var command in commands)
            {
                string result = command.Invoke();
                Console.WriteLine(result);
            }

            File.WriteAllText("commands.json", JsonConvert.SerializeObject(commands));
            commands = JsonConvert.DeserializeObject<List<Command>>(File.ReadAllText("commands.json"));

            foreach (var command in commands)
            {
                string result = command.Invoke();
                Console.WriteLine(result);
            }
            Console.ReadLine();
        }
    }

    public class Command
    {
        public string ClassName { get; set; }
        public string MethodName { get; set; }
        public object[] Parameters { get; set; }

        public string Invoke()
        {
            try
            {
                Type type = Type.GetType("DynamicMethodCall." + ClassName);
                object instance = Activator.CreateInstance(type);
                string response = (string)type.InvokeMember(MethodName,
                    BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
                    null, instance, Parameters);
                return response;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }

    public class Module1
    {
        public string Method1(string x)
        {
            return $"You called Method1 in Module1 with arg {x}.";
        }

        public string Method2(int x)
        {
            return $"You called Method2 in Module1 with arg {x}.";
        }
    }
}


그것은 반환

  • arg 1을 사용하여 Module1에서 Method1을 호출했습니다.
  • 인수 1을 사용하여 Module1에서 Method2를 호출했습니다.
  • arg 1을 사용하여 Module1에서 Method1을 호출했습니다.
  • 'DynamicMethodCall.Module1.Method2'메서드를 찾을 수 없습니다.

Newtonsoft serialize-deserialize 후 int 인수가있는 메서드가 작동하지 않음을 의미합니다. 문제가 무엇인지 아는 사람 있나요?

존 스키트

JSON 숫자 값이 다음과 같이 역 직렬화 될 것으로 예상하고 있습니다 int. 실제로는 long. 저는 이것이 "소수점이없는 숫자에 대해 Json.NET이하는 일"이라고 생각합니다. (변경할 수있는 옵션을 볼 수 없으며 하나가있는 것이 합리적 일지 모르겠습니다.)

deserialization 전후에 다음 줄을 추가하여 확인할 수 있습니다.

Console.WriteLine(commands[1].Parameters[0].GetType());

"디버깅은 유형이 올바른 것 같기 때문에 도움이되지 않습니다."라고 말합니다. -그러나이 경우 에는 값이 있는 메서드를 호출하려고하므로 정확 하지 않습니다long .

기본적으로 유형 정보를 직렬화하지 않기 때문에 원래 보유했던 것보다 적은 정보를 직렬화했습니다. Json.NET에는 TypeNameHandling일부 경우에 도움 이되는 설정이 있지만 실제 유형을 단순히 전파하도록 설득하지 못했습니다 (그러면 역 직렬화 할 수 있음).

또는 사용자 지정 변환기를 사용하여 int대신 역 직렬화 할 수 있습니다 . 그러나 물론으로 시작했다면 long그것은 옳지 않을 것입니다 ...

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C # Json 역 직렬화 실패

분류에서Dev

직렬화 후 Jquery Ajax Post 실패 [jquery / javascript]

분류에서Dev

개체 직렬화 후 list <object> C #으로 역 직렬화

분류에서Dev

C # MVC 컨트롤 Newtonsoft.json 직렬화

분류에서Dev

잭슨 직렬화는 writeValueAsString를 사용하여 객체를 직렬화 한 후 실패

분류에서Dev

객체 목록 직렬화 / 비 직렬화를위한 JSON Newtonsoft C # 모범 사례

분류에서Dev

JsValue 직렬화 실패

분류에서Dev

C # Newtonsoft.Json 최상위 수준 만 역 직렬화 하시겠습니까?

분류에서Dev

C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

분류에서Dev

C #에서 Newtonsoft Json.NET을 사용하여 JSON 역 직렬화

분류에서Dev

Newtonsoft.JSON을 사용하여 C #으로 Json 문자열 역 직렬화

분류에서Dev

C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

분류에서Dev

JSON Newtonsoft C # 다양한 유형의 객체 목록 역 직렬화

분류에서Dev

Alexa Skill 요청 역 직렬화 실패-SkillRequest 개체에 대한 JSON C #

분류에서Dev

newtonsoft json 역 직렬화 오류 처리 : 부분 역 직렬화

분류에서Dev

Newtonsoft로 모델 목록 직렬화

분류에서Dev

Newtonsoft JSON을 null로 직렬화 해제

분류에서Dev

newtonsoft로 json 배열 역 직렬화

분류에서Dev

Newtonsoft json.net 역 직렬화 NullReferenceException

분류에서Dev

Newtonsoft JSON은 템플릿 직렬화

분류에서Dev

Newtonsoft.Json으로 역 직렬화

분류에서Dev

Json 배열 Newtonsoft.Json 역 직렬화

분류에서Dev

Newtonsoft.Json을 사용하여 C #에서 중첩 배열로 json을 역 직렬화하는 방법

분류에서Dev

C #에서 Newtonsoft를 사용하여 Json에서 중첩 된 개체의 효율적인 수동 역 직렬화

분류에서Dev

C # Newtonsoft를 사용하여 JSON 파일을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

Python에서 C # Newtonsoft와 같은 클래스로 Json을 역 직렬화 할 수 있습니까?

분류에서Dev

직렬화 후 XML 변경

분류에서Dev

C ++ JSON 직렬화

분류에서Dev

C # 역 직렬화

Related 관련 기사

  1. 1

    C # Json 역 직렬화 실패

  2. 2

    직렬화 후 Jquery Ajax Post 실패 [jquery / javascript]

  3. 3

    개체 직렬화 후 list <object> C #으로 역 직렬화

  4. 4

    C # MVC 컨트롤 Newtonsoft.json 직렬화

  5. 5

    잭슨 직렬화는 writeValueAsString를 사용하여 객체를 직렬화 한 후 실패

  6. 6

    객체 목록 직렬화 / 비 직렬화를위한 JSON Newtonsoft C # 모범 사례

  7. 7

    JsValue 직렬화 실패

  8. 8

    C # Newtonsoft.Json 최상위 수준 만 역 직렬화 하시겠습니까?

  9. 9

    C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

  10. 10

    C #에서 Newtonsoft Json.NET을 사용하여 JSON 역 직렬화

  11. 11

    Newtonsoft.JSON을 사용하여 C #으로 Json 문자열 역 직렬화

  12. 12

    C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

  13. 13

    JSON Newtonsoft C # 다양한 유형의 객체 목록 역 직렬화

  14. 14

    Alexa Skill 요청 역 직렬화 실패-SkillRequest 개체에 대한 JSON C #

  15. 15

    newtonsoft json 역 직렬화 오류 처리 : 부분 역 직렬화

  16. 16

    Newtonsoft로 모델 목록 직렬화

  17. 17

    Newtonsoft JSON을 null로 직렬화 해제

  18. 18

    newtonsoft로 json 배열 역 직렬화

  19. 19

    Newtonsoft json.net 역 직렬화 NullReferenceException

  20. 20

    Newtonsoft JSON은 템플릿 직렬화

  21. 21

    Newtonsoft.Json으로 역 직렬화

  22. 22

    Json 배열 Newtonsoft.Json 역 직렬화

  23. 23

    Newtonsoft.Json을 사용하여 C #에서 중첩 배열로 json을 역 직렬화하는 방법

  24. 24

    C #에서 Newtonsoft를 사용하여 Json에서 중첩 된 개체의 효율적인 수동 역 직렬화

  25. 25

    C # Newtonsoft를 사용하여 JSON 파일을 역 직렬화하는 방법은 무엇입니까?

  26. 26

    Python에서 C # Newtonsoft와 같은 클래스로 Json을 역 직렬화 할 수 있습니까?

  27. 27

    직렬화 후 XML 변경

  28. 28

    C ++ JSON 직렬화

  29. 29

    C # 역 직렬화

뜨겁다태그

보관