问题描述:
我有一个抽象类A有a和b属性,
对象B继承自对象A,且对象B中有其特有的属性c和d
对象C继承自对象A,且对象C中有其特有的属性e和f
对象D是一个集合对象存储所有A的派生对象
当我序列化对象D的时候会发现生成的json中只有a和b属性,派生对象的特有属性无法序列化
[Serializable]
public abstract class A{
public string a;
public int b;
}
[Serializable]
public class B:A{
public float c;
public bool d;
}
[Serializable]
public class C:A{
public float e;
public string f;
}
[Serializable]
public class D{
public List<A> list = new List<A>();
}
解决问题
改造集合对象D,使对象D继承接口(ISerializationCallbackReceiver),然后在序列化之前将List包装成List<Serializable_A>,
Serializable_A是对象的具体形态,包含这个对象的所有属性,然后再在反序列化之后将List<Serializable_A>转化为List。这样就解决了上述问题。
[Serializable]
public class D: ISerializationCallbackReceiver{
[NonSerialized]
public List<A> list = new List<A>();
[SerializeField]
private List<Serializable_A> serializableList= new List<Serializable_A>();
public void OnBeforeSerialize()
{
if (list == null || list.Count <= 0)
{
serializableList.Clear();
return;
}
for (int i = 0; i < cardList.Count; i++)
{
Serializable_A obj = new Serializable_A(list[i]);
serializableList.Add(obj);
}
}
public void OnAfterDeserialize()
{
if (list == null) list = new List<A>();
else list.Clear();
if (serializableList == null || serializableList.Count <= 0) return;
for (int i = 0; i < serializableList.Count; i++)
{
Serializable_A serA = serializableList[i];
list.Add(serA.GetA());
}
serializableList.Clear();
}
[Serializable]
private class Serializable_A{
private string csName;
public B b;
public C c;
public Serializable_A(A a){
csName=a.GetType().Name;
switch (csName)
{
case nameof(B):
b=a as B;
break;
case nameof(C):
c=a as C;
break;
}
}
public A GetA()
{
switch (csName)
{
case nameof(B):
return b;
case nameof(C):
return c;
break;
}
return null;
}
}
}
美中不足
解决问题之后发现Serializable_A对象中的a或b属性就算为空引用,也会在序列化时自动构造对象来填补这个空引用,当然这并不会影响什么,但是仍然期待有更好的解决方案,有好方案的小伙伴可以底部留言哦