我在C#中遇到二进制序列化问题...我应该补充说我是C#的相对noob,所以请用简单的术语解释一下:)
无论如何,我有这个类(为了清楚起见被截断):
[Serializable]
public class Player : Ship {
而Ship看起来像这样(再次,截断):
[Serializable]
public class Ship : TiledActor {
public float MaxUserTurnPerSecond;
public float RemainingShieldStrength;
public float MaxShieldStrength;
public float ShieldRechargeRate;
public float ShieldRechargeDelay;
public Color ShieldColor;
public float ThrusterAccelerationScale;
public Color RippleTrailColor;
public float MinimumRippleSpeed;
public float MaxEnergy;
public float CurrentEnergy;
public float EnergyRechargeRate;
public float MaxSecondaryAmmoCapacity;
public int CurrentSecondaryAmmoCount;
public Weapon PrimaryWeapon;
public Weapon SecondaryWeapon;
protected ShieldActor ShieldTex;
[NonSerialized]
public MoXNA.ParticleMachines.PM_Explosion_Particle_Count ExplosionSize;
[NonSerialized]
protected MoXNA.ParticleMachines.MinSpeedRippleTrail rippleTrail;
/* ... Truncated here */
因此,正如您所看到的,我希望序列化Player类。但是,当我尝试这个时,我收到了这个错误:
未处理的类型异常 'System.Runtime.Serialization.SerializationException' 发生在mscorlib.dll
其他信息:输入 'MoXNA.ParticleMachines.MinSpeedRippleTrail' 在大会'SpaceshipInABox中, 版本= 1.0.0.0,文化=中立, PublicKeyToken = null'未标记为 序列化的。
这里奇怪的是我将 rippleTrail (这是 MinSpeedRippleTrail 对象)标记为[NonSerialized] ...我不想序列化它(它是只是一种视觉效果)。
我使用了“查找所有引用”,这是整个程序中唯一的 MinSpeedRippleTrail 对象,那到底是什么?
感谢。
答案 0 :(得分:4)
这里的常见问题是一个事件。 BinaryFormatter包含许多人不期望的事件。必须标记事件字段,例如:
[field:NonSerialized]
public event EventHandler Foo;
很容易获得一个你没预料到会破坏序列化程序的事件订阅(可能是一个捕获类)。
但是,我也鼓励你:
如果你想要一个与XNA一起使用的二进制序列化器,可以考虑使用protobuf-net;它更快,输出更小,适应更优雅的变化......并且是免费的。警告:我写了它。
答案 1 :(得分:0)
如果您使用的是XML序列化,则可以使用XmlIgnoreAttribute,否则将rippleTrail成员更改为方法。例如:GetRippleTrail()