Конец потока в C #, обнаруженный до завершения синтаксического анализа, или неверные значения при выполнении сериализации с использованием BinaryFormatter - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь сериализовать пользовательский класс в массив byte [] с помощью BinaryFormatter, загрузить его в steam с использованием steam-api, загрузить его снова позже и десериализовать обратно в пользовательский класс.Часть steam уже работает, но когда я десериализирую byte [] в 90% случаев, я получаю исключение SerializationException «конец потока, обнаруженный до завершения анализа», или оно фактически создает экземпляр класса, но все значения неверны.

10% времени работает нормально, хотя, не уверен, почему это работает иногда, но не большую часть времени.

Рассматриваемый класс

[Serializable]
public class ReplayEntry
{
    public List<SerializableVector3> Position;
    public List<SerializableVector3> Rotation;
    public List<SerializableVector3> Velocity;
    public float Offset;
    public UGCHandle_t handle;

    \\... Constructors below
}

Сериализация:

public static byte[] ObjectToByteArray(Object obj)
{
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        ms.Flush();
        return ms.ToArray();  
    }
}

Десериализация:

public static Object ByteArrayToObject(byte[] arrBytes)
{
    using (MemoryStream memStream = new MemoryStream(arrBytes))
    {
        BinaryFormatter binForm = new BinaryFormatter();
        memStream.Write(arrBytes, 0, arrBytes.Length);
        memStream.Seek(0, SeekOrigin.Begin);
        var obj = binForm.Deserialize(memStream);
        return obj;
    }
}

Тип 'SerializeableVector3' обусловлен тем, что вектор Unity3не сериализуем

[Serializable]
public struct SerializableVector3
{
    public float x;
    public float y;
    public float z;

    public SerializableVector3(float rX, float rY, float rZ)
    {
        x = rX;
        y = rY;
        z = rZ;
    }

    public static implicit operator Vector3(SerializableVector3 rValue)
    {
        return new Vector3(rValue.x, rValue.y, rValue.z);
    }

    public static implicit operator SerializableVector3(Vector3 rValue)
    {
        return new SerializableVector3(rValue.x, rValue.y, rValue.z);
    }
}
...