уточнить;ограничение на списки просто в том, что сам список не рассматривается как ссылка. элементы равны , если они находятся на элементе, помеченном AsReference
- например:
[Test]
public void SerializeTheEasyWay()
{
var list = GetListOfThings();
using (var fs = File.Create(@"things.bin"))
{
ProtoBuf.Serializer.Serialize(fs, list);
fs.Close();
}
using (var fs = File.OpenRead(@"things.bin"))
{
list = ProtoBuf.Serializer.Deserialize<MyDto>(fs);
Assert.AreEqual(3, list.Things.Count);
Assert.AreNotSame(list.Things[0], list.Things[1]);
Assert.AreSame(list.Things[0], list.Things[2]);
fs.Close();
}
}
[ProtoContract]
public class MyDto
{
[ProtoMember(1, AsReference = true)]
public List<Thing> Things { get; set; }
}
private MyDto GetListOfThings()
{
var thing1 = new Thing("thing1");
var thing2 = new Thing("thing2");
var list = new List<Thing>();
list.Add(thing1);
list.Add(thing2);
list.Add(thing1);
return new MyDto {Things = list};
}
(и веселофакт - это на самом деле точно то же самое на проводе)
Там делает , однако, похоже, ошибка в том, как он создает экземпляр в этом случае;он использует .ctor
и терпит неудачу.Я исследую и исправлю это, однако также сработает следующее:
1: сделать параметр .ctor
общедоступным:
public Thing()
{
}
2: или, альтернативно, отключить .ctor
:
[ProtoContract(SkipConstructor = true)]
public class Thing
{ ...
Я выясню, почему частные конструкторы без параметров не устраивают в этом сценарии.