Здесь настоящий мозговой сбой в пятницу днем! : - (
Foo и Bar в реальном мире являются типами из сторонней библиотеки и не подходят для сериализации.
(Не имеет отношения к вопросу, но для ясности мне не нужно возвращать конверсию, я собираюсь десертилизировать суррогатные типы для сценария воспроизведения, который мне нужно реализовать.)
class Program
{
static void Main(string[] args)
{
RuntimeTypeModel.Create();
var model = RuntimeTypeModel.Default;
model.Add(typeof(Foo), false).SetSurrogate(typeof(FooSurrogate));
model.Add(typeof(Bar), false).SetSurrogate(typeof(BarSurrogate));
var st = new List<Bar> { new Bar { String1 = "Text1" }, new Bar { String1 = "Text2" } };
var ct = new Foo { Index = 99, Bars = st };
using (var outputStream = File.Create("foo.bin"))
{
Serializer.Serialize(outputStream, ct);
}
}
}
public class Foo
{
public int Index { get; set; }
public List<Bar> Bars { get; set; }
}
public class Bar
{
public string String1 { get; set; }
}
[ProtoContract]
public class FooSurrogate
{
public static implicit operator FooSurrogate(Foo value)
{
var fs = new FooSurrogate
{
Index = value.Index
};
return fs;
}
public static implicit operator Foo(FooSurrogate value)
{
throw new NotImplementedException(); // I'm never going to need this conversion
}
[ProtoMember(1)] public int Index { get; set; }
[ProtoMember(2)] public List<BarSurrogate> Bars { get; set; }
}
[ProtoContract]
public class BarSurrogate
{
public static implicit operator BarSurrogate(Bar value)
{
return new BarSurrogate
{
String1 = value.String1
};
}
public static implicit operator Bar(BarSurrogate value)
{
throw new NotImplementedException(); // I'm never going to need this conversion
}
[ProtoMember(1)]
public string String1 { get; set; }
}
Как мне обработать \ обработать списки?
РЕДАКТИРОВАТЬ: я могу достичь удовлетворительного результата, изменив мой класс FooSurrogate, как показано ниже; это то, как я должен делать это или есть лучшие и \ или более простые варианты?
[ProtoContract]
public class FooSurrogate
{
public static implicit operator FooSurrogate(Foo value)
{
if (value == null) return null;
var fs = new FooSurrogate
{
Index = value.Index
};
if (value.Bars != null)
{
fs.Bars = new List<BarSurrogate>();
foreach (var bar in value.Bars)
{
fs.Bars.Add(bar);
}
}
return fs;
}
public static implicit operator Foo(FooSurrogate value)
{
throw new NotImplementedException(); // I'm never going to need this conversion
}
[ProtoMember(1)]
public int Index { get; set; }
[ProtoMember(2)]
public IList<BarSurrogate> Bars { get; set; }
}