Unity 3d和RavenDB:System.InvalidOperationException:无法转换文档System.FormatException:输入字符串的格式不正确

时间:2018-05-01 00:29:45

标签: c# .net database unity3d ravendb

我遇到了一些问题。我不确定它是与数据有关还是与Raven有关。我在Unity3d中使用Raven。我已经工作了一两个星期,并试图让所有方面都得到平衡,他们甚至实施了一些补丁以使其正常工作。我现在非常接近,但继续遇到“System.InvalidOperationException:无法转换文档System.FormatException:输入字符串格式不正确”的错误。 DB中的数据当前来自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正在将NPC的指定ZoneId与调用该脚本的脚本的ZoneId进行比较没有任何东西实际上是指我找到的文件ID)

        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类型的实体---&gt; System.FormatException:输入字符串的格式不正确。   在System.Number.StringToNumber(System.String str,System.Globalization.NumberStyles options,System.Number + NumberBuffer&amp; number,System.Globalization.NumberFormatInfo info,System.Boolean parseDecimal)[0x00057] in:0   在System.Number.ParseInt32(System.String s,System.Globalization.NumberStyles样式,System.Globalization.NumberFormatInfo信息)[0x00013] in:0   在System.Int32.Parse(System.String s,System.Globalization.NumberStyles样式,System.IFormatProvider提供程序)[0x0000e] in:0   在System.Convert.ToInt32(System.String值,System.IFormatProvider提供程序)[0x00005] in:0   在System.String.System.IConvertible.ToInt32(System.IFormatProvider提供程序)[0x00000]中:0   在System.Convert.ChangeType(System.Object值,System.Type conversionType,System.IFormatProvider提供程序)[0x0011a] in:0   在Raven.Client.Json.BlittableJsonReader.ReadAsInt32()[0x000c7] in&lt; 3af6f962c10f46e297126f8db0cace22&gt;:0   at Newtonsoft.Json.JsonReader.ReadForType(Newtonsoft.Json.Serialization.JsonContract contract,System.Boolean hasConverter)[0x0004a] in:0   在Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolvePropertyAndCreatorValues(Newtonsoft.Json.Serialization.JsonObjectContract contract,Newtonsoft.Json.Serialization.JsonProperty containerProperty,Newtonsoft.Json.JsonReader reader,System.Type objectType)[0x000db] in:0   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectUsingCreatorWithParameters(Newtonsoft.Json.JsonReader reader,Newtonsoft.Json.Serialization.JsonObjectContract contract,Newtonsoft.Json.Serialization.JsonProperty containerProperty,Newtonsoft.Json.Serialization.ObjectConstructor 1[T] creator, System.String id) [0x000b2] in <dc86da7fc46c487ba6c7ab826da479cc>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject (Newtonsoft.Json.JsonReader reader, Newtonsoft.Json.Serialization.JsonObjectContract objectContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, Newtonsoft.Json.Serialization.JsonProperty containerProperty, System.String id, System.Boolean& createdFromNonDefaultCreator) [0x0008b] in <dc86da7fc46c487ba6c7ab826da479cc>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x00148] in <dc86da7fc46c487ba6c7ab826da479cc>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x0006d] in <dc86da7fc46c487ba6c7ab826da479cc>:0 at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType, System.Boolean checkAdditionalContent) [0x000db] in <dc86da7fc46c487ba6c7ab826da479cc>:0 at Newtonsoft.Json.JsonSerializer.DeserializeInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00053] in <dc86da7fc46c487ba6c7ab826da479cc>:0 at Newtonsoft.Json.JsonSerializer.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00000] in <dc86da7fc46c487ba6c7ab826da479cc>:0 at Raven.Client.Documents.Conventions.JsonNetBlittableEntitySerializer.EntityFromJsonStream (System.Type type, Sparrow.Json.BlittableJsonReaderObject jsonObject) [0x0006e] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.EntityToBlittable.ConvertToEntity (System.Type entityType, System.String id, Sparrow.Json.BlittableJsonReaderObject document) [0x0009b] in <3af6f962c10f46e297126f8db0cace22>:0 --- End of inner exception stack trace --- at Raven.Client.Documents.Session.EntityToBlittable.ConvertToEntity (System.Type entityType, System.String id, Sparrow.Json.BlittableJsonReaderObject document) [0x000e1] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.InMemoryDocumentSessionOperations.TrackEntity (System.Type entityType, System.String id, Sparrow.Json.BlittableJsonReaderObject document, Sparrow.Json.BlittableJsonReaderObject metadata, System.Boolean noTracking) [0x000d0] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.InMemoryDocumentSessionOperations.TrackEntity[T] (System.String id, Sparrow.Json.BlittableJsonReaderObject document, Sparrow.Json.BlittableJsonReaderObject metadata, System.Boolean noTracking) [0x00000] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.Operations.QueryOperation.Deserialize[T] (System.String id, Sparrow.Json.BlittableJsonReaderObject document, Sparrow.Json.BlittableJsonReaderObject metadata, Raven.Client.Documents.Session.Tokens.FieldsToFetchToken fieldsToFetch, System.Boolean disableEntitiesTracking, Raven.Client.Documents.Session.InMemoryDocumentSessionOperations session) [0x0000d] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.Operations.QueryOperation.Complete[T] () [0x0007f] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.DocumentQuery 1 [ T] .ExecuteQueryOperation(System.Nullable 1[T] take) [0x0005c] in <3af6f962c10f46e297126f8db0cace22>:0 at Raven.Client.Documents.Session.DocumentQuery 1 [T] .GetEnumerator()[0x00000] in&lt; 3af6f962c10f46e297126f8db0cace22&gt ;:0   at 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] source)[0x00018] in&lt; 839a3cb835c04d14aeb58d83bb7bc4bd&gt;: 0   在Framework.Server.Game.MmoZone.LoadZone()[0x00215] in:0异常捕获。

1 个答案:

答案 0 :(得分:0)

我弄明白了。事实证明,因为我使用枚举/字节,RavenDB 4.x现在只使用字符串和数字,所以我不得不添加一些额外的json反序列化/转换方法来获取数据加载到我的游戏中,但它现在都运行良好。感谢Raven的Oren花了将近一个星期的时间和我一起努力让所有人都努力工作。他有一个圣人的耐心。我强烈推荐这个数据库!