Unity 3d и RavenDB: System.InvalidOperationException: не удалось преобразовать документ System.FormatException: входная строка была в неправильном формате - PullRequest
0 голосов
/ 01 мая 2018

У меня есть некоторые проблемы. Я не уверен, что это с данными или с вороной. Я использую Raven в Unity3d. Я работал в течение недели или двух с поддержкой, пытаясь все расставить по местам, они даже внедрили некоторые патчи, чтобы это работало. Сейчас я действительно близко, но продолжаю сталкиваться с ошибкой «System.InvalidOperationException: не удалось преобразовать документ System.FormatException: входная строка была в неправильном формате». Данные в БД в настоящее время взяты из дампа данных из версии 3.x, поэтому я не уверен, были ли какие-либо различия в структуре или что-либо, что я не учел, но я использовал встроенный импортер, и он Насколько я могу судить, данные были приняты очень хорошо и не дали никаких других ошибок или указаний на то, что это проблема с этим.

Я сделаю все возможное, чтобы объяснить и показать код, если у кого-то есть предложения, я был бы очень признателен. Одна проблема, с которой я столкнулся в начале, это то, что я использую игровую платформу, которая была первоначально сделана несколько лет назад и которую я обновил. Он использовал Raven 3.x, а при попытке обновить его до 4.x были обнаружены проблемы с совместимостью, потому что Unity еще не реализовал .netstandard 2.0. С выпуском Unity 2018.1 на прошлой неделе в RC1 появилась поддержка .netstandard, так что я наконец смог получить связь между Unity и Raven.

На данный момент игра пытается запросить у БД информацию о NPC и предметах для хранения в кеше.

Ниже приведен исходный запрос с момента, когда он использовал Raven 3.x (строка n => n.ZoneId == this.id сравнивает присвоенный идентификатор ZoneId NPC с идентификатором ZoneId сценария, который вызывает данные Ничто на самом деле не относится к идентификатору документа, который я нашел)

        using (var session = this.world.WorldDatabase.OpenSession())
        {
            // load all npcs
            foreach (var npcData in session.Query<NpcData>("Npc/ByZoneId").Where(n => n.ZoneId == this.id))
            {
                var npc = new Npc(this, npcData.Guid, npcData.GroupId, (NpcType) npcData.NpcType, npcData);
                this.objectCache.AddItem(npc);

                var position = npcData.Position.ToVector();
                position.Y = this.GetHeight(position.X, position.Z);
                var rotation = Quaternion.CreateEular(0, npcData.Orientation, 0);
                this.PrimaryFiber.Enqueue(() => npc.Spawn(position, rotation));
            }

Я не был уверен, что это не понравилось, поэтому я попытался следовать документации, как показано ниже.

                IList<NpcData> query = session 
                    .Query<NpcData>("Npc/ByZoneId")
                    .Where(n => n.ZoneId == zid)
                    .ToList(); 

                foreach (var npcData in query)
                {
                    var npc = new Npc(this, npcData.Guid, npcData.GroupId, (NpcType) npcData.NpcType, npcData);
                    this.objectCache.AddItem(npc);
                    var position = npcData.Position.ToVector();
                    position.Y = this.GetHeight(position.X, position.Z);
                    var rotation = Quaternion.CreateEular(0, npcData.Orientation, 0);
                    this.PrimaryFiber.Enqueue(() => npc.Spawn(position, rotation));
                }

У меня есть настройка интерфейса с этим:

    IRavenQueryable<T> Query<T>(string indexName) where T : IDataObject;

и затем установка DatabaseFactory со следующим:

    public IRavenQueryable<T> Query<T>(string indexName) where T : IDataObject
    {
        using (var session = store.OpenSession())
        {
            return session.Query<T>(indexName);
        }
    }

Вот как выглядят данные в БД. Я подумал, что изображение было бы хорошей идеей, чтобы вы могли видеть и фактическое имя документа в случае, если это поможет с чем-либо:

https://i.imgur.com/Bb39WNm.png

Независимо от того, что я пытаюсь, я продолжаю получать эту ошибку. Если это поможет, полная ошибка здесь ниже. Если потребуется дополнительная информация, сообщите мне, и я предоставлю ее.

Заранее спасибо!

System.InvalidOperationException: Не удалось преобразовать документ NPC / 1818637598 в объект типа Framework.Server.Data.NpcData ---> System.FormatException: входная строка была в неправильном формате. в System.Number.StringToNumber (System.String str, параметры System.Globalization.NumberStyles, System.Number + NumberBuffer & number, информация System.Globalization.NumberFormatInfo, System.Boolean parseDecimal) [0x00057] в: 0 в System.Number.ParseInt32 (System.String s, стиль System.Globalization.NumberStyles, информация System.Globalization.NumberFormatInfo) [0x00013] в: 0 в System.Int32.Parse (System.String s, System.Globalization.NumberStyles style, поставщик System.IFormatProvider) [0x0000e] в: 0 в System.Convert.ToInt32 (значение System.String, поставщик System.IFormatProvider) [0x00005] в: 0 в System.String.System.IConvertible.ToInt32 (поставщик System.IFormatProvider) [0x00000] в: 0 в System.Convert.ChangeType (значение System.Object, преобразование System.Type, поставщик System.IFormatProvider) [0x0011a] в: 0 в Raven.Client.Json.BlittableJsonReader.ReadAsInt32 () [0x000c7] в <3af6f962c10f46e297126f8db0cace22>: 0 в Newtonsoft.Json.JsonReader.ReadForType (контракт Newtonsoft.Json.Serialization.JsonContract, System.Boolean hasConverter) [0x0004a] в: 0в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolvePropertyAndCreatorValues ​​(контракт Newtonsoft.Json.Serialization.JsonObjectContract, контейнерный объект Newtonsoft.Json.Serialization.JsonProperty, объект Newtonsoft.Json.JsonReader 0 0ypey в формате 0: тысяч долларов США) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectUsingCreatorWithParameters (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonObjectContract контракт, Newtonsoft.Json.Serialization.Json * объект недвижимости 1процесс .ExecuteQueryOperation (System.Nullable 1[T] take) [0x0005c] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.DocumentQuery 1 [T] .GetEnumerator () [0x00000] в <3af6f962c10f46e297126f8db0cace22>: 0 в Raven.Client.Documents.Linq.RavenQueryInspector 1[T].GetEnumerator () [0x00011] in <3af6f962c10f46e297126f8db0cace22>:0 at System.Collections.Generic.List 1 [T] .. ctor (System.Collections.Generic.IEnumerable 1[T] collection) [0x00062] in <e1a80661d61443feb3dbdaac88eeb776>:0 at System.Linq.Enumerable.ToList[TSource] (System.Collections.Generic.IEnumerable 1 [T] источник) [0x00018] в <839a3cb835c04d14aeb58d83bb7bc4b> b в Framework.Server.Game.MmoZone.LoadZone () [0x00215] в: 0 Обнаружено исключение.

1 Ответ

0 голосов
/ 02 мая 2018

У меня все получилось. Оказывается, потому что я использовал enum / byte, RavenDB 4.x теперь использует только строки и числа, поэтому мне пришлось добавить несколько дополнительных методов десериализации / преобразования json, чтобы загрузить данные в мою игру, но теперь все работает хорошо. Огромное, huuuugeeee, спасибо Oren of Raven за то, что он провел почти неделю, работая со мной, чтобы все это заработало. У него терпение святого. Я настоятельно рекомендую эту базу данных!

...