C# Protobuf网与泛型

C# Protobuf网与泛型,c#,protocol-buffers,protobuf-net,C#,Protocol Buffers,Protobuf Net,我对protobuf-net和泛型的使用有问题 鉴于: [DataContract] public class CacheData { [DataMember(Order = 1)] public List<CacheLoadItem<int>> Foo; [DataMember(Order = 2)] public List<CacheLoadItem<int>> Bar; [DataMembe

我对protobuf-net和泛型的使用有问题

鉴于:

    [DataContract]
public class CacheData
{
    [DataMember(Order = 1)]
    public List<CacheLoadItem<int>> Foo;

    [DataMember(Order = 2)]
    public List<CacheLoadItem<int>> Bar;

    [DataMember(Order = 3)]
    public List<CacheLoadItem<int>> XXX;

    [DataMember(Order = 4)]
    public List<CacheLoadItem<string>> YYY;

    [DataMember(Order = 5)]
    public List<CacheLoadItem<int>> Other;

    [DataMember(Order = 6)]
    public List<CacheLoadItem<int>> Other2;

    [DataMember(Order = 7)]
    public List<CacheLoadItem<int>> Other3;

    [DataMember(Order = 8)]
    public List<CacheLoadItem<string>> EvenMore;

    [DataMember(Order = 9)]
    public List<CacheLoadItem<string>> AlmostThere;
}

[DataContract]
public class CacheLoadItem<V>
{
    [DataMember(Order = 1)]
    public int ID;

    [DataMember(Order = 2)]
    public string Name;

    [DataMember(Order = 3)]
    public V Value;
}
[DataContract]
公共类缓存数据
{
[数据成员(顺序=1)]
公开名单;
[数据成员(顺序=2)]
公共列表栏;
[数据成员(顺序=3)]
公众名单XXX;
[数据成员(顺序=4)]
公开名单YYY;
[数据成员(顺序=5)]
其他公开名单;
[数据成员(顺序=6)]
公开名单2;
[数据成员(顺序=7)]
公开名单3;
[数据成员(顺序=8)]
更公开的名单;
[数据成员(顺序=9)]
几乎没有公开名单;
}
[数据合同]
公共类CacheLoadItem
{
[数据成员(顺序=1)]
公共int ID;
[数据成员(顺序=2)]
公共字符串名称;
[数据成员(顺序=3)]
公共价值观;
}
具有泛型int列表的CacheLoadItem可以很好地序列化,但具有泛型字符串列表的CacheLoadItem不能序列化

我认为这与泛型列表首先被序列化有关

具有通用字符串列表的CacheLoadItem包含正确数量的项,但具有默认值/空值


有人知道为什么会发生这种情况吗?

好的,它肯定与实体框架相关

缓存数据通过LINQtoEF脉冲处理

比如:

使用(var myDatabase=newmydatabase(entityBuilder.ToString())
{
result.A=(从myDatabase.ATable中的A中选择new CacheLoadItem{ID=A.ID,Name=A.Name,Value=A.Number});
result.B=(从myDatabase.B表中的B选择new CacheLoadItem{ID=B.ID,Name=B.Name,Value=B.Code});
result.C=(从myDatabase.CTable中的C中选择new CacheLoadItem{ID=C.ID,Name=C.Name,Value=C.ID});
result.D=(从myDatabase.DTable中的D中选择new CacheLoadItem{ID=D.ID,Name=D.Name,Value=D.Number});
result.E=(从MyDatabaseTable中的E中选择new CacheLoadItem{ID=E.ID,Name=E.Name,Value=E.Number});
result.F=(从myDatabase.FTable中的F中选择new CacheLoadItem{ID=F.ID,Name=F.Name,Value=F.Number});
result.G=(从MyDatabaseTable中的G中选择new CacheLoadItem{ID=G.ID,Name=G.Name,Value=G.Code});
result.H=(从myDatabaseHTable中的H选择新的CacheLoadItem{ID=H.ID,Name=H.Name,Value=H.Number});
result.I=(从MyDatabaseTable中的I选择new CacheLoadItem{ID=I.ID,Name=I.Name,Value=I.Number});
}
不起作用,但以下各项起作用

            using (var myDatabase = new MyDatabase(entityBuilder.ToString()))
        {
            result.A = (from a in myDatabase.ATable select a).ToList().Select(b => new CacheLoadItem<int> { ID = a.ID, Name = a.Name, Value = a.Number }).ToList();
            result.B = (from b in myDatabase.BTable select b).ToList().Select(b=>new CacheLoadItem<string> { ID = b.ID, Name = b.Name, Value = b.Code }).ToList();
            result.C = (from c in myDatabase.CTable select c).ToList().Select(c=> new CacheLoadItem<int> { ID = c.ID, Name = c.Name, Value = c.ID }).ToList();
            result.D = (from d in myDatabase.DTable select d).ToList().Select(d=> new CacheLoadItem<int> { ID = d.ID, Name = d.Name, Value = d.Number }).ToList();
            result.E = (from e in myDatabaseETable select e).ToList().Select(e=> new CacheLoadItem<int> { ID = e.ID, Name = e.Name, Value = e.Number }).ToList();
            result.F = (from f in myDatabase.FTable select f).ToList().Select(f => new CacheLoadItem<string> { ID = f.ID, Name = f.Name, Value = f.Number }).ToList();
            result.G = (from g in myDatabaseGTable select g).ToList().Select(g=> new CacheLoadItem<string> { ID = g.ID, Name = g.Name, Value = g.Code }).ToList();
            result.H = (from h in myDatabaseHTable select h).ToList().Select(h=> new CacheLoadItem<int> { ID = h.ID, Name = h.Name, Value = h.Number }).ToList();
            result.I = (from i in myDatabaseITable select i).ToList().Select(i=> new CacheLoadItem<int> { ID = i.ID, Name = i.Name, Value = i.Number }).ToList();
        }
使用(var myDatabase=newmydatabase(entityBuilder.ToString())
{
result.A=(从myDatabase.ATable中的A中选择A).ToList().select(b=>newcacheLoadItem{ID=A.ID,Name=A.Name,Value=A.Number}.ToList();
result.B=(从myDatabase.B表中的B中选择B).ToList().select(B=>newcacheLoadItem{ID=B.ID,Name=B.Name,Value=B.Code}).ToList();
result.C=(从myDatabase.CTable中的C选择C).ToList().select(C=>newcacheloaditem{ID=C.ID,Name=C.Name,Value=C.ID}).ToList();
result.D=(从myDatabase.DTable中的D中选择D).ToList().select(D=>newcacheloaditem{ID=D.ID,Name=D.Name,Value=D.Number}).ToList();
result.E=(从MyDatabaseTable中的E选择E).ToList().select(E=>newcacheLoadItem{ID=E.ID,Name=E.Name,Value=E.Number}).ToList();
result.F=(从myDatabase.FTable中的F中选择F).ToList().select(F=>newcacheloaditem{ID=F.ID,Name=F.Name,Value=F.Number}.ToList();
result.G=(从MyDatabaseTable中的G中选择G).ToList().select(G=>newcacheLoadItem{ID=G.ID,Name=G.Name,Value=G.Code}).ToList();
result.H=(从myDatabaseHTable中的H选择H).ToList().select(H=>newcacheLoadItem{ID=H.ID,Name=H.Name,Value=H.Number}).ToList();
result.I=(从MyDatabaseTable中的I选择I).ToList().select(I=>newCacheLoadItem{ID=I.ID,Name=I.Name,Value=I.Number}).ToList();
}
不同之处在于,我不是在LinqToEF中进行转换,而是在LINQtoObjects中进行转换


所以我猜EF被破坏了?

好的,它肯定与实体框架相关

缓存数据通过LINQtoEF脉冲处理

比如:

使用(var myDatabase=newmydatabase(entityBuilder.ToString())
{
result.A=(从myDatabase.ATable中的A中选择new CacheLoadItem{ID=A.ID,Name=A.Name,Value=A.Number});
result.B=(从myDatabase.B表中的B选择new CacheLoadItem{ID=B.ID,Name=B.Name,Value=B.Code});
result.C=(从myDatabase.CTable中的C中选择new CacheLoadItem{ID=C.ID,Name=C.Name,Value=C.ID});
result.D=(从myDatabase.DTable中的D中选择new CacheLoadItem{ID=D.ID,Name=D.Name,Value=D.Number});
result.E=(从MyDatabaseTable中的E中选择new CacheLoadItem{ID=E.ID,Name=E.Name,Value=E.Number});
result.F=(从myDatabase.FTable中的F中选择new CacheLoadItem{ID=F.ID,Name=F.Name,Value=F.Number});
result.G=(从MyDatabaseTable中的G中选择new CacheLoadItem{ID=G.ID,Name=G.Name,Value=G.Code});
result.H=(从myDatabaseHTable中的H选择新的CacheLoadItem{ID=H.ID,Name=H.Name,Value=H.Number});
result.I=(从MyDatabaseTable中的I选择new CacheLoadItem{ID=I.ID,Name=I.Name,Value=I.Number});
}
不起作用,但以下各项起作用

            using (var myDatabase = new MyDatabase(entityBuilder.ToString()))
        {
            result.A = (from a in myDatabase.ATable select a).ToList().Select(b => new CacheLoadItem<int> { ID = a.ID, Name = a.Name, Value = a.Number }).ToList();
            result.B = (from b in myDatabase.BTable select b).ToList().Select(b=>new CacheLoadItem<string> { ID = b.ID, Name = b.Name, Value = b.Code }).ToList();
            result.C = (from c in myDatabase.CTable select c).ToList().Select(c=> new CacheLoadItem<int> { ID = c.ID, Name = c.Name, Value = c.ID }).ToList();
            result.D = (from d in myDatabase.DTable select d).ToList().Select(d=> new CacheLoadItem<int> { ID = d.ID, Name = d.Name, Value = d.Number }).ToList();
            result.E = (from e in myDatabaseETable select e).ToList().Select(e=> new CacheLoadItem<int> { ID = e.ID, Name = e.Name, Value = e.Number }).ToList();
            result.F = (from f in myDatabase.FTable select f).ToList().Select(f => new CacheLoadItem<string> { ID = f.ID, Name = f.Name, Value = f.Number }).ToList();
            result.G = (from g in myDatabaseGTable select g).ToList().Select(g=> new CacheLoadItem<string> { ID = g.ID, Name = g.Name, Value = g.Code }).ToList();
            result.H = (from h in myDatabaseHTable select h).ToList().Select(h=> new CacheLoadItem<int> { ID = h.ID, Name = h.Name, Value = h.Number }).ToList();
            result.I = (from i in myDatabaseITable select i).ToList().Select(i=> new CacheLoadItem<int> { ID = i.ID, Name = i.Name, Value = i.Number }).ToList();
        }
使用(var myDatabase=newmydatabase(entityBuilder.ToString())
{
result.A=(从myDatabase.ATable中的A中选择A).ToList().select(b=>new C