<T>이

2013-03-24 7 views
1

내가 MongoDB의에서 TwitterStatus 클래스를 직렬화 복원 다음과 같은 문제가, 여기에 MongoDB를 C#을 드라이버 1.8.0.124 및 TweetSharp 2.0을 사용하여 실패한 단위 테스트입니다했다 MongoDB를 Enumerable에서에서 ICollection이 같은 직렬화 복원 :<T>이

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 클래스를 직렬화 할 수 있습니까? 참고 the TwitterEntity classes

답변

2

TwitterStatus는 속성이있다

public virtual TwitterEntities Entities 

그리고

public class TwitterEntities : IEnumerable<TwitterEntity> 

로 정의하기 때이 시도 후 JSon.NET은 TwitterEntities 인스턴스을하고 역 직렬화 트위터 엔티티으로 작성하십시오. 그러나이를 수행하려면 Add 메서드가 필요하고 IEnumerable에는이 메서드가 제공되지 않습니다. 그러나 ICollection(T)을 제공하고 메서드를 추가하기 때문에 ICollection (T)을 요청하는 것입니다.

그러나 MongoDb IMO를 사용하는 경우 직접 JSON 변환을해서는 안됩니다. 간단한 POCO 클래스 만 있으면 MongoDb 드라이버가 자동으로 이러한 클래스 인스턴스의 직렬화를 처리합니다.

문서 데이터베이스 작업의 장점.

+0

감사합니다. TwitterStatus를 MongoDB의 간단한 POCO 클래스로 사용하고 싶었지만 내 간단한 클래스로 매핑해야 할 필요가 있다고 생각합니다. – cDima