1

MongoDBでTwitterStatusクラスを逆シリアル化する際に次の問題が発生します。これは、MongoDB C#ドライバー1.8.0.124とTweetSharp2.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}";

    }
}

スローされる例外はEnumerable class TwitterEntities does not implement ICollection<T> so it can't be deserialized、以下のフルスタックトレースです。

フルスタックトレース:

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)

この例外なしに、mongoDBからTweetStatusクラスを逆シリアル化するにはどうすればよいですか?参考までに、TwitterEntityクラスがあります

4

1 に答える 1

2

TwitterStatusにはプロパティがあります

public virtual TwitterEntities Entities

そしてそれは次のように定義されます

public class TwitterEntities : IEnumerable<TwitterEntity>

JSon.NETを逆シリアル化すると、TwitterEntitiesのインスタンスが作成され、その後、 TwitterEntityアイテムで埋めようとします。ただし、これを行うにはAddメソッドが必要であり、IEnumerableはそれを提供しません。ただし、ICollection(T)はAddメソッドを提供するため、ICollection(T)を要求します。

ただし、MongoDb IMOを使用している場合は、JSON変換を直接実行しないでください。単純なPOCOクラスのみが必要であり、MongoDbドライバーがこれらのクラスインスタンスの(逆)シリアル化を自動的に処理します。

これが、ドキュメントデータベースを操作することの利点です。

于 2013-03-24T20:24:20.220 に答える