Unable to properly serialize object for the player of class 'UnityEngine.GameObject' because of extra field

Hi, I am having an issue with a script not being serialized properly when building for Windows Standalone. When the exe is run, the output log says:

The file ‘C:/Users/One/Desktop/ZipZapTest/Game_Data/sharedassets0.assets’ is corrupted! Remove it and launch unity again!
[Position out of bounds! 35275732 > 35275728]

In the editor log when doing a build I get a few messages like the following:

Unable to properly serialize object for the player of class ‘UnityEngine.GameObject’ because of extra field ‘leftTurrets’ of type ‘ZZTurret modreq(System.Runtime.CompilerServices.IsVolatile)’ (expecting ‘UnityEngine.GameObject’ ‘TurretBasePrefab’)
UnityEditor.BuildPipeline:BuildPlayerInternalNoCheck(String, String, BuildTarget, BuildOptions, Boolean, UInt32&)
UnityEditor.BuildPlayerWindow:BuildPlayerWithDefaultSettings(Boolean, BuildOptions, Boolean) (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\BuildPlayerWindow.cs:743)
UnityEditor.BuildPlayerWindow:BuildPlayerWithDefaultSettings(Boolean, BuildOptions) (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\BuildPlayerWindow.cs:575)
UnityEditor.BuildPlayerWindow:GUIBuildButtons(Boolean, Boolean, Boolean, BuildPlatform) (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\BuildPlayerWindow.cs:1550)
UnityEditor.BuildPlayerWindow:ShowBuildTargetSettings() (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\BuildPlayerWindow.cs:1514)
UnityEditor.BuildPlayerWindow:OnGUI() (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\BuildPlayerWindow.cs:1134)
System.Reflection.MonoMethod:InternalInvoke(Object, Object, Exception&)
System.Reflection.MonoMethod:Invoke(Object, BindingFlags, Binder, Object, CultureInfo) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
System.Reflection.MethodBase:Invoke(Object, Object) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
UnityEditor.HostView:Invoke(String, Object) (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\GUI\DockArea.cs:231)
UnityEditor.HostView:Invoke(String) (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\GUI\DockArea.cs:224)
UnityEditor.HostView:OnGUI() (at C:\BuildAgent\work\d3d49558e4d408f4\Editor\Mono\GUI\DockArea.cs:120)

I have seen similar questions on here that say the problem is related to having a C# and a JS script named the same thing, but I have searched through the entire project and can find no such duplicates.

The script in question looks like this:

using UnityEngine;
using System.Collections;

public enum TurretUpgrade
{
    LaserRangeX2,
    LaserRangeX4,
    LaserSpeedX2,
    LaserSpeedX4,
}

public class ZZTurretManager : MonoBehaviour
{
    public volatile ZZTurret[] leftTurrets;
    public volatile ZZTurret[] rightTurrets;
    public AudioClip clip;
    ZZGameLogic gameLogic;
    Transform theTransform;
    public GameObject TurretBasePrefab;
    public GameObject Turret2xSpeed;
    public GameObject Turret4xSpeed;
    public GameObject Turret2xRange;
    public GameObject Turret4xRange;
    public GameObject Turret2xBoth;
    public GameObject Turret4xBoth;
    GameObject ChosenTurret;
    Vector3[] leftTurretPositions;
    Vector3[] rightTurretPositions;
    Vector3[] leftTurretRotations;
    Vector3[] rightTurretRotations;
    ArrayList upgradesObtained;

    void Awake()
    {
        theTransform = this.transform;

        ZZCache.turretManager = this;
        upgradesObtained = new ArrayList();

        leftTurretPositions = new Vector3[leftTurrets.Length];
        leftTurretRotations = new Vector3[leftTurrets.Length];

        rightTurretPositions = new Vector3[rightTurrets.Length];
        rightTurretRotations = new Vector3[rightTurrets.Length];

        for (int i = 0; i < leftTurrets.Length; i++)
        {
            Transform turretTransform = leftTurrets*.transform.parent;*

leftTurretPositions = turretTransform.localPosition;
leftTurretRotations = turretTransform.localEulerAngles;
}

for (int i = 0; i < rightTurrets.Length; i++)
{
Transform turretTransform = rightTurrets*.transform.parent;*
rightTurretPositions = turretTransform.localPosition;
rightTurretRotations = turretTransform.localEulerAngles;
}
}

void Start()
{
gameLogic = ZZCache.gameLogic;

ChosenTurret = TurretBasePrefab;

if (IAP.isIAPPurchased(IAP.IAPName.FASTER_SHIP_LASERS_4X) && IAP.isIAPPurchased(IAP.IAPName.SHIP_LASER_RANGE_4X))
{
ChosenTurret = Turret4xBoth;
}
else if (IAP.isIAPPurchased(IAP.IAPName.FASTER_SHIP_LASERS_2X) && IAP.isIAPPurchased(IAP.IAPName.SHIP_LASER_RANGE_2X))
{
ChosenTurret = Turret2xBoth;
}
else if (IAP.isIAPPurchased(IAP.IAPName.FASTER_SHIP_LASERS_4X) && IAP.isIAPPurchased(IAP.IAPName.SHIP_LASER_RANGE_2X))
{
ChosenTurret = Turret2xBoth;
}
else if (IAP.isIAPPurchased(IAP.IAPName.FASTER_SHIP_LASERS_2X) && IAP.isIAPPurchased(IAP.IAPName.SHIP_LASER_RANGE_4X))
{
ChosenTurret = Turret2xBoth;
}
else if (IAP.isIAPPurchased(IAP.IAPName.FASTER_SHIP_LASERS_4X))
{
ChosenTurret = Turret4xSpeed;
}
else if (IAP.isIAPPurchased(IAP.IAPName.FASTER_SHIP_LASERS_2X))
{
ChosenTurret = Turret2xSpeed;
}
else if (IAP.isIAPPurchased(IAP.IAPName.SHIP_LASER_RANGE_4X))
{
ChosenTurret = Turret4xRange;
}
else if (IAP.isIAPPurchased(IAP.IAPName.SHIP_LASER_RANGE_2X))
{
ChosenTurret = Turret2xRange;
}

for (int i = 0; i < leftTurrets.Length; i++)
{
DestroyImmediate(leftTurrets*.transform.parent.gameObject);*
}
for (int i = 0; i < rightTurrets.Length; i++)
{
DestroyImmediate(rightTurrets*.transform.parent.gameObject);*
}

HealAllTurrets();

}

// Windows Only
public void UpgradeTurrets(TurretUpgrade upgrade)
{
if (!upgradesObtained.Contains(upgrade))
{
upgradesObtained.Add(upgrade);
}

if (upgrade == TurretUpgrade.LaserRangeX2)
{
if (ChosenTurret == TurretBasePrefab)
{
ChosenTurret = Turret2xRange;
}
else if (upgradesObtained.Contains(TurretUpgrade.LaserSpeedX4) || upgradesObtained.Contains(TurretUpgrade.LaserSpeedX2))
{
ChosenTurret = Turret2xBoth;
}
}
else if (upgrade == TurretUpgrade.LaserSpeedX2)
{
if (ChosenTurret == TurretBasePrefab)
{
ChosenTurret = Turret2xSpeed;
}
else if (upgradesObtained.Contains(TurretUpgrade.LaserRangeX4) || upgradesObtained.Contains(TurretUpgrade.LaserRangeX2))
{
ChosenTurret = Turret2xBoth;
}
}
else if (upgrade == TurretUpgrade.LaserRangeX4)
{
if (upgradesObtained.Contains(TurretUpgrade.LaserSpeedX4))
{
ChosenTurret = Turret4xBoth;
}
else if (upgradesObtained.Contains(TurretUpgrade.LaserSpeedX2))
{
ChosenTurret = Turret2xBoth;
}
else
{
ChosenTurret = Turret4xRange;
}
}
else if (upgrade == TurretUpgrade.LaserSpeedX4)
{
if (upgradesObtained.Contains(TurretUpgrade.LaserRangeX4))
{
ChosenTurret = Turret4xBoth;
}
else if (upgradesObtained.Contains(TurretUpgrade.LaserRangeX2))
{
ChosenTurret = Turret2xBoth;
}
else
{
ChosenTurret = Turret4xSpeed;
}
}

for (int i = 0; i < leftTurrets.Length; i++)
{
if (leftTurrets != null)
{
GameObject go = leftTurrets*.transform.parent.gameObject;*
leftTurrets*.StopAllCoroutines();*
Destroy(go);
}
}
for (int i = 0; i < rightTurrets.Length; i++)
{
if (rightTurrets != null)
{
GameObject go = rightTurrets*.transform.parent.gameObject;*
rightTurrets*.StopAllCoroutines();*
Destroy(go);
}
}
StopAllCoroutines();

StartCoroutine(UpdateTurretSpeed());

if (upgradesObtained.Contains(TurretUpgrade.LaserRangeX4))
{
ZZCache.leftCollider.SetX4Range();
ZZCache.rightCollider.SetX4Range();
}
else if (upgradesObtained.Contains(TurretUpgrade.LaserRangeX2))
{
ZZCache.leftCollider.SetX2Range();
ZZCache.rightCollider.SetX2Range();
}

}

IEnumerator UpdateTurretSpeed()
{
yield return StartCoroutine(Utils.RunAfterFrames(HealAllTurrets, 5));
foreach (ZZTurret turret in leftTurrets)
{
if (upgradesObtained.Contains(TurretUpgrade.LaserSpeedX4))
{
turret.SetX4Speed();
}
else if (upgradesObtained.Contains(TurretUpgrade.LaserSpeedX2))
{
turret.SetX2Speed();
}
}
foreach (ZZTurret turret in rightTurrets)
{
if (upgradesObtained.Contains(TurretUpgrade.LaserSpeedX4))
{
turret.SetX4Speed();
}
else if (upgradesObtained.Contains(TurretUpgrade.LaserSpeedX2))
{
turret.SetX2Speed();
}
}
}

public void DisableTurretScripts()
{
for (int i = 0; i < leftTurrets.Length; i++)
{
if (leftTurrets != null)
{
leftTurrets*.enabled = false;*
}
}
for (int i = 0; i < rightTurrets.Length; i++)
{
if (rightTurrets != null)
{
rightTurrets*.enabled = false;*
}
}
}

public void EnableTurretScripts()
{
for (int i = 0; i < leftTurrets.Length; i++)
{
if (leftTurrets != null)
{
leftTurrets*.enabled = true;*
leftTurrets*.readyToFire = true;*
}
}
for (int i = 0; i < rightTurrets.Length; i++)
{
if (rightTurrets != null)
{
rightTurrets*.enabled = true;*
rightTurrets*.readyToFire = true;*
}
}
}

public void PlayAudioOnFire()
{
gameLogic.PlayClip (clip);
}

public void FireAtTarget(GameObject asteroid, bool rightCollider)
{
ZZTurret[] turrets = rightCollider ? rightTurrets : leftTurrets;
Vector3 colliderPosition = asteroid.transform.position;

float closest = float.MaxValue;
ZZTurret closestTurret = null;

foreach (ZZTurret turret in turrets)
{
if (turret.targetAsteroid != null && turret.targetAsteroid.Equals(asteroid))
{
return;
}
}

foreach (ZZTurret turret in turrets)
{
if (turret != null && turret.readyToFire)
{
if (Vector3.Angle(colliderPosition - turret.transform.position, rightCollider ? Vector3.right : Vector3.left) <= 65.0f)
{
float distance = Vector3.Distance(turret.transform.position, colliderPosition);
if (distance < closest)
{
closest = distance;
closestTurret = turret;
}
}
}
}
if (closestTurret != null && !closestTurret.isDestroyed)
{
closestTurret.targetAsteroid = asteroid;
closestTurret.rightTurret = rightCollider;
StartCoroutine(closestTurret.FireProjectile());
}
}

public void DestroyAllTurrets()
{
foreach (ZZTurret turret in leftTurrets)
{
turret.isDestroyed = true;
}
foreach (ZZTurret turret in rightTurrets)
{
turret.isDestroyed = true;
}
}

public void EnableAllTurrets()
{
foreach (ZZTurret turret in leftTurrets)
{
turret.isDestroyed = false;
}
foreach (ZZTurret turret in rightTurrets)
{
turret.isDestroyed = false;
}
}

public void HealAllTurrets()
{
for (int i = 0; i < leftTurrets.Length; i++)
{
if (leftTurrets == null || leftTurrets*.isDestroyed)*
{

GameObject newTurret = Utils.InstantiatePrefab(ChosenTurret, theTransform);

Transform turretTransform = newTurret.transform;
turretTransform.localPosition = leftTurretPositions*;*
turretTransform.localEulerAngles = leftTurretRotations*;*

leftTurrets = newTurret.GetComponentInChildren();

iTween.ScaleFrom(leftTurrets*.transform.parent.gameObject,*
iTween.Hash(false,
“scale”, Vector3.zero,
“time”, 1.0f));
}
}

for (int i = 0; i < rightTurrets.Length; i++)
{
if (rightTurrets == null || rightTurrets*.isDestroyed)*
{

GameObject newTurret = Utils.InstantiatePrefab(ChosenTurret, theTransform);

Transform turretTransform = newTurret.transform;
turretTransform.localPosition = rightTurretPositions*;*
turretTransform.localEulerAngles = rightTurretRotations*;*

rightTurrets = newTurret.GetComponentInChildren();

iTween.ScaleFrom(rightTurrets*.transform.parent.gameObject,*
iTween.Hash(false,
“scale”, Vector3.zero,
“time”, 1.0f));
}
}
}
}

I have rewritten the script in question and things work fine now.

I just came across the same issue. It turns out to be the fields marked as public volatile (your leftTurrets and rightTurrets fields). Remove either public or volatile and the serialization issue goes away.

I wasn’t able to find any other references to this being one of the many causes of the quite common “file is corrupted! Remove it and launch unity again” error.