게임 정보 로드시 디시리얼라이징 오류 문의

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 뒤끝 SDK 버전 : 5.4.5
  • 프로젝트명 : raiserpg
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :
    MissingMethodException: Default constructor not found for type BlackTree.HeroBaseData
    System.RuntimeType.CreateInstanceMono (System.Boolean nonPublic) (at <695d1cc93cca45069c528c15c9fdd749>:0)
    System.RuntimeType.CreateInstanceSlow (System.Boolean publicOnly, System.Boolean skipCheckThis, System.Boolean fillCache, System.Threading.StackCrawlMark& stackMark) (at <695d1cc93cca45069c528c15c9fdd749>:0)
    System.RuntimeType.CreateInstanceDefaultCtor (System.Boolean publicOnly, System.Boolean skipCheckThis, System.Boolean fillCache, System.Threading.StackCrawlMark& stackMark) (at <695d1cc93cca45069c528c15c9fdd749>:0)
    System.Activator.CreateInstance (System.Type type, System.Boolean nonPublic) (at <695d1cc93cca45069c528c15c9fdd749>:0)
    System.Activator.CreateInstance (System.Type type) (at <695d1cc93cca45069c528c15c9fdd749>:0)
    LitJson.JsonMapper.ReadValue (System.Type inst_type, LitJson.JsonReader reader) (at <498e8279b39b41478600b851a0c83f73>:0)
    LitJson.JsonMapper.ReadValue (System.Type inst_type, LitJson.JsonReader reader) (at <498e8279b39b41478600b851a0c83f73>:0)
    LitJson.JsonMapper.ReadValue (System.Type inst_type, LitJson.JsonReader reader) (at <498e8279b39b41478600b851a0c83f73>:0)
    LitJson.JsonMapper.ToObject[T] (System.String json) (at <498e8279b39b41478600b851a0c83f73>:0)
    BlackTree.BackendManager.LoadCharacterList (BlackTree.HeroInventoryObject inven, System.Action action) (at Assets/PartyRpg/Scripts/Manager/BackendManager.cs:141)
    BlackTree.HeroInventoryInterface.Update () (at Assets/PartyRpg/Scripts/UI/Hero/HeroInventoryInterface.cs:39)

게임정보 관리를 위해 var _json = BackendReturnObject.Flatten(_bro.Rows());로 로드하여
for(int i=0; i< _json.Count; ++i)
{
var item = LitJson.JsonMapper.ToObject < BaseDataList >(_item[i].ToJson());
Debug.Log(item.ToString());
}
이런식으로 사용중인데 위처럼 오류가 납니다 BaseDataList에는 int변수 4개를 가지고있는 클래스의 리스트를
변수로 가지고 있습니다. 대소문자 구분 모두 확실히 하고 있는데 디시리얼라이징에서 왜 오류가 나는지 이해가 가지 않습니다. 위 오류가 해결이 안된다면 json데이터를 하나하나 스트링값으로 불러오는 방법밖엔 안보입니다. 도움 부탁드립니다.

안녕하세요 개발자님.

코드로 의심되는 부분은 Object하는 대상이 제공하신 코드에는 존재하지 않는 _item[i]로 파싱하여 에러가 발생하는 듯 합니다.
혹은 BaseDataList 에 private인 변수나 함수, 혹은 인자값이 없는 생성자가 존재할 경우 파싱이 원할이 되지 않을 수 있습니다.

for(int i=0; i< _json.Count; ++i)
{
var item = LitJson.JsonMapper.ToObject < BaseDataList >(_item[i].ToJson()); // _item이 아닌 _json으로 변경
Debug.Log(item.ToString());
}

혹은 아래 함수에 이상이 없을 경우, 아래 예제 코드를 보시고 참고해주시기 바랍니다.

클래스

class TestClass
{
    public TestClass()
    {
    }
    public int num1 = 10;
    public int num2 = 10;
    public int num3 = 10;
    public int num4 = 10;
    public string ToString()
    {
        return string.Format("num1 : {0} / num2 : {1} num3 : {2} / num4 : {3}", num1, num2, num3, num4);
    }
}

파싱

//데이터 삽입
List<TestClass> classList = new List<TestClass>();
classList.Add(new TestClass());
Param param = new Param();
param.Add("list", classList);
Backend.GameData.Insert("table",param);

// 데이터 불러오기 및 파싱
var bro = Backend.GameData.Get("table", new Where());

var json = bro.FlattenRows(); // 아래 주석 코드와 동일합니다.
//var json = BackendReturnObject.Flatten(bro.Rows());

foreach (JsonData js in json)
{
    var tempClassList = LitJson.JsonMapper.ToObject<List<TestClass>>(js["list"].ToJson()); // 인자값이 없는 생성자가 존재해야합니다.
    foreach (var tempClass in tempClassList)
    {
        Debug.Log(li.ToString()); // TestClass
    }
}

말씀하신 내용처럼 작성하였으나
MissingMethodException: Default constructor not found for type~~~ 와 같은 오류가 다시 발생했습니다.(_item->_json으로 변수명은 변경 하였습니다.) 혹시 몰라 newtonsoft의 디시리얼라이즈를 사용하여 실행해보았으나 결과는 같습니다. 다른해결책이 있는지 알려주세요.

혹시 해당 클래스 코드 공유가 가능하실까요?(멤버변수 및 생성자 부분 코드)

public class HeroBaseData
{
public string level;
public string amount;
public string idx;
public string awakelv;
}
void Save()
{
List herodatalist = new List();
foreach(var _data in inventory.GetSlots)
{
herodatalist.Add(_data.herobasedata);//다른곳의 인벤토리 데이터를 임시로 넣음
}
param.Add(“heroinventory”, herodatalist);
Backend.GameData.Insert(“heroinventory”, param, callback => { });
}
public void LoadCharacterList()
{
BackendReturnObject _bro;
_bro = Backend.GameData.Get(“heroinventory”, new Where());
if (_bro.IsSuccess())
{
var _json= _bro.FlattenRows();
foreach(JsonData js in _json)
{
var tempClassList = LitJson.JsonMapper.ToObject< List < HeroBaseData > >(js[“heroinventory”].ToJson());
foreach (var tempClass in tempClassList)
{
Debug.Log(tempClass.ToString()); // TestClass
}
//GetCharacterData(js[ConstraintsData.heroinventory]);
}

        }
       
    }

세이브와 로드 모드 작성하였습니다

테스트 해본 결과 해당 에러 없이는 정상적으로 디시얼라이즈가 성공했는데요.

혹시 아래 코드 이용시에도 에러가 발생하는지 확인해주시기 바랍니다.

변경점

1. List() -> List<HeroBaseData>()
2. HeroData 직접 생성
List<HeroBaseData> herodatalist = new List<HeroBaseData>();
for (int i = 0; i < 5; i++)
{
    HeroBaseData hero = new HeroBaseData();
    hero.level = "Level" + i;
    hero.amount = "amount" + i;
    hero.idx = "idx" + i;
    hero.awakelv = "awakelv" + i;
    herodatalist.Add(hero);
}
Param param = new Param();
param.Add("heroinventory", herodatalist);
Backend.GameData.Insert("heroinventory", param);
BackendReturnObject _bro;
_bro = Backend.GameData.Get("heroinventory", new Where());
if (_bro.IsSuccess())
{
    var _json = _bro.FlattenRows();
    foreach (JsonData js in _json)
    {
        var tempClassList = LitJson.JsonMapper.ToObject<List<HeroBaseData>>(js["heroinventory"].ToJson());
        foreach (HeroBaseData tempClass in tempClassList)
        {
            Debug.Log("레벨 : " + tempClass.level);
            Debug.Log(tempClass.ToString()); // TestClass
        }
        //GetCharacterData(js[ConstraintsData.heroinventory]);
    }
}

시리얼라이징 하는 부분
var tempClassList = LitJson.JsonMapper.ToObject<List>(js[“heroinventory”].ToJson());
이곳에서 맨 위에 써놓은 오류가 아직도 떠서 아직 해결방법을 못찾았습니다. 혹 버전문제인가 싶어 5.6.0에서 해봐도 그대로네요…

위에 작성되어있는 로직에서 문제가 발생하지는 않고,
그 외 설정값들의 외부적인 것으로 인해 에러가 발생하는 것으로 추정이 됩니다.

해당 에러는 생성자 관련 에러로 보이기 때문에
해당 클래스에 임의로 생성자 코드를 넣어주시고 테스트해주시기 바랍니다.

public class HeroBaseData
{
public HeroBaseData()
{
}
public string level;
public string amount;
public string idx;
public string awakelv;
}

오마이갓… 기존생성자가 아닌 생성자를 다 오버라이드 해서 사용하다보니 생긴 오류였나 봅니다… parameter 없는 기본 생성자가 있어야 json 리플렉션 도중에 오류가 안나는듯 합니다… 감사합니다. 해결되었습니다!

좋아요 1