То, что вы описали, потребует ISerializable
(настраиваемая сериализация) с обычной BinaryFormatter
- однако, protobuf-net позволит вам упростить вещи (так что вам не нужно обрабатывать детали самостоятельно), обычно делая данные меньше в процессе:
[ProtoContract]
public class Foo : ISerializable
{
// Unique Identifier:
[ProtoMember(1)]
public int Id;
public Bar Bar;
[ProtoMember(2)]
private int? BarProxy {
get {
if(Bar == null) return null;
return Bar.Id;
}
set {
if(value == null) { Bar = null; }
else { // fetch from repository
Bar = new Bar();
Bar.Id = value;
}
}
}
public Foo() { }
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context) {
Serializer.Serialize(info, this);
}
protected Foo(SerializationInfo info, StreamingContext context) {
Serializer.Merge(info, this);
}
}
public class Bar
{
// Unique Identifier:
public int Id;
}
Для более простых настроек:
Какой сериализатор вы используете?
- с помощью
BinaryFormatter
вы помечаете поля, которые вам не нужны, как [NonSerialized]
- с
XmlSerializer
, вы помечаете участников, которых вы не хотите, [XmlIgnore]
- с
DataContractSerializer
, вы просто не помечаете их [DataContract]
Также - возможно, рассмотрим protobuf-net ; это имеет очень эффективный бинарный механизм; более чем BinaryFormatter