Dictionary<string,List<T>> serialize error
GoogleCodeExporter opened this issue · comments
Google Code Exporter commented
What steps will reproduce the problem?
1. when I serialize a type Dictionary<string,List<T>> it throw a error.
2. TupleSerializer.cs line : 44
3. "No serializer defined for type: Namespace.Model.ModelClass (with
serializable and datacontract attributes)
T is a very sample class here :
[Serializable,DataContract]
public class ReviewTopic
{
public int Id { get; set; }
public string Title { get; set; }
}
What is the expected output? What do you see instead?
What version of the product are you using? On what operating system?
Win7 64x ,protobuf-net V 2.0.0.651,protobuf-net.Enyim v1.0.0.0
Please provide any additional information below.
在 ProtoBuf.Serializers.TupleSerializer..ctor(RuntimeTypeModel model, ConstructorInfo ctor, MemberInfo[] members) 位置 E:\tfs-source\\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Serializers\TupleSerializer.cs:行号 50
在 ProtoBuf.Meta.MetaType.BuildSerializer() 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\MetaType.cs:行号 439
在 ProtoBuf.Meta.MetaType.get_Serializer() 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\MetaType.cs:行号 384
在 ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 key, Object value, ProtoWriter dest) 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\RuntimeTypeModel.cs:行号 761
在 ProtoBuf.Meta.TypeModel.TrySerializeAuxiliaryType(ProtoWriter writer, Type type, DataFormat format, Int32 tag, Object value, Boolean isInsideList) 位置 E:\tfs-source\bitauto\A3车型产品研发\点评\Src\BitAutoReviews.V4\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\TypeModel.cs:行号 124
在 ProtoBuf.Meta.TypeModel.TrySerializeAuxiliaryType(ProtoWriter writer, Type type, DataFormat format, Int32 tag, Object value, Boolean isInsideList) 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\TypeModel.cs:行号 170
在 ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter writer, Object value) 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\TypeModel.cs:行号 188
在 ProtoBuf.Meta.TypeModel.Serialize(Stream dest, Object value, SerializationContext context) 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\TypeModel.cs:行号 217
在 ProtoBuf.Meta.TypeModel.Serialize(Stream dest, Object value) 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net\Meta\TypeModel.cs:行号 201
在 ProtoBuf.Caching.Enyim.NetTranscoder.Enyim.Caching.Memcached.ITranscoder.Serialize(Object o) 位置 E:\tfs-source\plugins\protobuf-net r640\protobuf-net-source\protobuf-net.Enyim\protobuf-net.Enyim\ProtoTranscoder.cs:行号 125
在 Enyim.Caching.MemcachedClient.PerformStore(StoreMode mode, String key, Object value, UInt32 expires, UInt64& cas, Int32& statusCode) 位置 d:\Dropbox\repo\EnyimMemcached\Enyim.Caching\MemcachedClient.cs:行号 355
Original issue reported on code.google.com by liurongw...@gmail.com
on 30 Aug 2013 at 7:20
Google Code Exporter commented
The error message talks about ModelClass, but the question talks about
ReviewTopic - can you clarify?
Original comment by marc.gravell
on 30 Aug 2013 at 7:22
Google Code Exporter commented
No modelClass here(just for example), I have modify the ReviewTopic below, the
exception gone ,But when I deserialize from memcache use the ProtoTranscoder, I
got the values Dictionary<string,List<ReviewTopic>> data, the List<ReviewTopic>
in dictionary has value ,but every ReviewTopic 's Property is empty .
[Serializable,DataContract]
public class ReviewTopic
{
[DataMember(Name="id")]
public int Id { get; set; }
[DataMember(Name = "title")]
public string Title { get; set; }
}
Original comment by liurongw...@gmail.com
on 30 Aug 2013 at 8:10
Google Code Exporter commented
When I save the Dictionary<string,List<ReviewTopic>> data to memcache, Every
ReviewTopic property has value .
Original comment by liurongw...@gmail.com
on 30 Aug 2013 at 8:12
Google Code Exporter commented
Indeed; if using the DataMember attributes you need to use the Order to control
serialization:
[DataMember(Name="id", Order=1)]
public int Id { get; set; }
[DataMember(Name = "title", Order=2)]
public string Title { get; set; }
protocol buffers is numbers-based, not name-based.
Original comment by marc.gravell
on 30 Aug 2013 at 8:33
Google Code Exporter commented
thanks a ton ,it work,by the way , what 's best practice to use the
Serializable,DataContract,ProtoContract for protobuff serialization, and need I
mark all used property of a serializable class ?
I have some class which didn't have this problem ,it wase only marked as
[Serializable].
as you say 'protocol buffers is numbers-based, not name-based.', why my other
class worked correctly ?
[Serializable]
public class Impression
{
public int Id { get; set; }
public int SerialId { get; set; }
public string Keywords { get; set; }
public int Vote { get; set; }
public string Guid { get; set; }
}
this class when serialize with protobuff don't has exception ? so what 's the
correct way to use it ?
Original comment by liurongw...@gmail.com
on 30 Aug 2013 at 9:38
Google Code Exporter commented
protobuf-net won't serialize that class *at all*; most likely that is working
because it is using some other serializer implementation - presumably
defaulting to BinaryFormatter for things that clearly aren't usable. Note,
protobuf-net also doesn't care whether or not something is marked
[Serializable] - it doesn't check for that and doesn't require that.
Original comment by marc.gravell
on 30 Aug 2013 at 10:03
- Changed state: Invalid