C#序列化问题

时间:2011-02-25 18:00:11

标签: c# serialization

我在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 对象,那到底是什么?

感谢。

2 个答案:

答案 0 :(得分:4)

这里的常见问题是一个事件。 BinaryFormatter包含许多人不期望的事件。必须标记事件字段,例如:

[field:NonSerialized]
public event EventHandler Foo;

很容易获得一个你没预料到会破坏序列化程序的事件订阅(可能是一个捕获类)。

但是,我也鼓励你:

  • 不要使用公共字段;使用属性
  • 不要使用BinaryFormatter - 它最终会咬住大多数人;并且咬得很难

如果你想要一个与XNA一起使用的二进制序列化器,可以考虑使用protobuf-net;它更快,输出更小,适应更优雅的变化......并且是免费的。警告:我写了它。

答案 1 :(得分:0)

如果您使用的是XML序列化,则可以使用XmlIgnoreAttribute,否则将rippleTrail成员更改为方法。例如:GetRippleTrail()