Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从MongoDB可枚举文件反序列化为ICollection<;T>;_C#_Mongodb_Serialization_Bson_Tweetsharp - Fatal编程技术网

C# 从MongoDB可枚举文件反序列化为ICollection<;T>;

C# 从MongoDB可枚举文件反序列化为ICollection<;T>;,c#,mongodb,serialization,bson,tweetsharp,C#,Mongodb,Serialization,Bson,Tweetsharp,我在MongoDB中反序列化TwitterStatus类时遇到了以下问题,下面是使用MongoDB C#driver 1.8.0.124和TweetSharp 2.0进行的失败单元测试: using Microsoft.VisualStudio.TestTools.UnitTesting; using MongoDB.Driver; using MongoDB.Driver.Builders; using System.Linq; using TweetSharp; namespace DS.

我在MongoDB中反序列化TwitterStatus类时遇到了以下问题,下面是使用MongoDB C#driver 1.8.0.124和TweetSharp 2.0进行的失败单元测试:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System.Linq;
using TweetSharp;

namespace DS.Model.Tests
{
    [TestClass]
    public class TestMongoSerialization
    {
        [TestMethod]
        public void CanDeserializeTwitterEntitiesFromMongoDB()
        {
            var server = new MongoClient().GetServer();
            MongoDatabase db = server.GetDatabase("test");
            var tweets = db.GetCollection<TwitterStatus>("tweetSerialized");

            var tweet = Newtonsoft.Json.JsonConvert.DeserializeObject<TwitterStatus>(tweetWithTwitterEntityiesSerialized);
            Assert.AreEqual(1, tweet.Entities.Count());
            Assert.AreEqual(TwitterEntityType.Url, tweet.Entities.First().EntityType);
            tweets.Save(tweet);
            Assert.AreEqual(1, tweets.FindAll().Count()); 

            var tweetFromMango = tweets.FindOne(Query<TwitterStatus>.EQ(s => s.Id, 315278676398858240));
            Assert.AreEqual(TwitterEntityType.Url, tweetFromMango.Entities.First().EntityType); // throws exception [1]
        }

        string tweetWithTwitterEntityiesSerialized = @"{""Id"":315278676398858240,""Text"":""TeePublic Funds 22 Designs "",""RetweetedStatus"":null,""created_at"":""2013-03-23T01:47:48Z"",""geo"":null,""Entities"":{""user_mentions"":[],""hashtags"":[],""urls"":[{""url"":""http://t.co/rBGN46rua7"",""expanded_url"":""http://zite.to/10uCED9"",""indices"":[71,93],""EntityType"":2}],""media"":[]},""possibly_sensitive"":false,""Place"":null}";

    }
}
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用MongoDB.Driver;
使用MongoDB.Driver.Builders;
使用System.Linq;
使用TweetSharp;
命名空间DS.Model.Tests
{
[测试类]
公共类TestMongoSerialization
{
[测试方法]
public void cands将来自MongoDB()的TwitterEntities序列化
{
var server=new MongoClient().GetServer();
MongoDatabase db=server.GetDatabase(“测试”);
var tweets=db.GetCollection(“tweetSerialized”);
var tweet=Newtonsoft.Json.JsonConvert.DeserializeObject(tweetWithTwitterEntityiesSerialized);
AreEqual(1,tweet.Entities.Count());
AreEqual(TwitterEntityType.Url,tweet.Entities.First().EntityType);
tweets.Save(tweet);
AreEqual(1,tweets.FindAll().Count());
var tweetFromMango=tweets.FindOne(Query.EQ(s=>s.Id,315278676398858240));
Assert.AreEqual(TwitterEntityType.Url,tweetFromMango.Entities.First().EntityType);//引发异常[1]
}
string tweetWithTwitterEntityiesSerialized=@“{”Id“:315278676398858240”,“Text“:”TeePublic Funds 22设计“,”RetweedStatus“:null“,”created_at“:”2013-03-23T01:47:48Z“,”geo“:null“,”实体“:{”用户_提及“:[],”哈希标签“:[],”url“:[{”url:”http://t.co/rBGN46rua7“”扩展的url:“”http://zite.to/10uCED9“”索引“”:[71,93],“EntityType”“:2}],“media”“:[]}”,“可能敏感”“:false”,“Place”“:null}”;
}
}
引发的异常是可枚举类TwitterEntities未实现ICollection,因此无法对其进行反序列化,下面是完整堆栈跟踪

完整堆栈跟踪:

System.IO.FileFormatException: An error occurred while deserializing the Entities property of class TweetSharp.TwitterStatus: 
Enumerable class TwitterEntities does not implement ICollection<T> so it can't be deserialized. ---> MongoDB.Bson.BsonSerializationException: Enumerable class TwitterEntities does not implement ICollection<T> so it can't be deserialized.
Result StackTrace:  
at MongoDB.Bson.Serialization.Serializers.EnumerableSerializer`1.CreateInstance(Type type)
   at MongoDB.Bson.Serialization.Serializers.EnumerableSerializer`1.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap)
 --- End of inner exception stack trace ---
    at MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader bsonReader, BsonMemberMap memberMap)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, Type actualType, IBsonSerializationOptions options)
   at MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options)
   at MongoDB.Bson.Serialization.BsonSerializer.Deserialize(BsonReader bsonReader, Type nominalType, IBsonSerializationOptions options)
System.IO.FileFormatException:反序列化TweetSharp.TwitterStatus类的Entities属性时出错:
可枚举类TwitterEntities未实现ICollection,因此无法反序列化。-->MongoDB.Bson.BsonSerializationException:可枚举类TwitterEntities未实现ICollection,因此无法反序列化。
结果跟踪:
位于MongoDB.Bson.Serialization.Serializers.EnumerableSerializer`1.CreateInstance(类型)
在MongoDB.Bson.Serialization.Serializers.EnumerableSerializer`1.Deserialize(BsonReader BsonReader,类型nominalType,类型actualType,IBMsonSerializationOptions)
位于MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader BsonReader,BsonMemberMap memberMap)
---内部异常堆栈跟踪的结束---
位于MongoDB.Bson.Serialization.BsonClassMapSerializer.DeserializeMemberValue(BsonReader BsonReader,BsonMemberMap memberMap)
在MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader-BsonReader,键入nominalType,键入actualType,IBsonSerializationOptions)
在MongoDB.Bson.Serialization.BsonClassMapSerializer.Deserialize(BsonReader-BsonReader,键入nominalType,IBsonSerializationOptions)
在MongoDB.Bson.Serialization.BsonSerializer.Deserialize(BsonReader-BsonReader,键入nominalType,IBsonSerializationOptions)
如果没有此异常,如何从mongoDB反序列化TweetStatus类?
作为参考,TwitterStatus有一个属性

public virtual TwitterEntities Entities
它的定义是

public class TwitterEntities : IEnumerable<TwitterEntity>
公共类TwitterEntities:IEnumerable
现在,当反序列化JSon.NET创建一个TwitterEntities的实例时,然后尝试用TwitterEntity的项填充它。但要做到这一点,它需要一个Add方法,而IEnumerable不提供。 但是确实提供了添加方法,这就是为什么它要求ICollection(T)

但是如果您使用的是MongoDb IMO,您不应该直接进行任何JSON转换。您应该只有简单的POCO类,MongoDb驱动程序将自动为您处理这些类实例的(反)序列化


这就是使用文档数据库的美妙之处。

谢谢;我希望使用TwitterStatus作为MongoDB的一个简单POCO类,但我想我需要将它映射到我自己的一个更简单的类。