Search Unity

Confusion around serializing SharedComponentData

Discussion in 'Entity Component System' started by cjddmut, Dec 20, 2019.

  1. cjddmut

    cjddmut

    Joined:
    Nov 19, 2012
    Posts:
    179
    I'm trying to figure out how to serialize a world that has shared components and I'm running into issues. The shared components do not appear to be serializing. Below a test case that tries to get it to work and I'm unsure of what I'm doing incorrectly.


    Code (CSharp):
    1. public struct SharedData : ISharedComponentData
    2. {
    3.     public int value;
    4. }
    5.  
    6. [Test]
    7. public unsafe void TestSharedDataSerialization()
    8. {
    9.     World world = new World("World 1");
    10.  
    11.     Entity entity = world.EntityManager.CreateEntity(
    12.         world.EntityManager.CreateArchetype(typeof(TestComponentFloat)));
    13.    
    14.     SharedData data = default;
    15.     data.value = 10;
    16.    
    17.     world.EntityManager.AddSharedComponentData(entity, data);
    18.     Assert.IsTrue(world.EntityManager.GetSharedComponentData<SharedData>(entity).value == 10);
    19.    
    20.     // Needing, the apparent need, two writers to so that I can read in the reverse order seems odd
    21.     MemoryBinaryWriter writer1 = new MemoryBinaryWriter();
    22.     MemoryBinaryWriter writer2 = new MemoryBinaryWriter();
    23.    
    24.     SerializeUtility.SerializeWorld(world.EntityManager, writer1, out int[] sc);
    25.    
    26.     SerializeUtility.SerializeSharedComponents(world.EntityManager, writer2, sc);
    27.    
    28.     MemoryBinaryReader reader1 = new MemoryBinaryReader(writer1.Data);
    29.     MemoryBinaryReader reader2 = new MemoryBinaryReader(writer2.Data);
    30.    
    31.     World world2 = new World("World 2");
    32.  
    33.     // It appears I have to do shared comps first (reverse order) or the length in the deserialize world
    34.     // fails
    35.     SerializeUtility.DeserializeSharedComponents(world2.EntityManager, reader2);
    36.        
    37.     ExclusiveEntityTransaction transaction = world2.EntityManager.BeginExclusiveEntityTransaction();
    38.    
    39.     SerializeUtility.DeserializeWorld(transaction, reader1, sc.Length);
    40.    
    41.     world2.EntityManager.EndExclusiveEntityTransaction();
    42.  
    43.     NativeArray<Entity> entities = world2.EntityManager.GetAllEntities(Allocator.Temp);
    44.    
    45.     Assert.IsTrue(world2.EntityManager.HasComponent<SharedData>(entities[0]));
    46.    
    47.     // Test below fails with value equal to 0
    48.     Assert.IsTrue(world2.EntityManager.GetSharedComponentData<SharedData>(entities[0]).value == 10);
    49.    
    50.     entities.Dispose();
    51.     writer1.Dispose();
    52.     writer2.Dispose();
    53.     world.Dispose();
    54.     world2.Dispose();
    55. }
     
  2. tertle

    tertle

    Joined:
    Jan 25, 2011
    Posts:
    3,761
    What version of entities are you using? I don't even see SerializeSharedComponents method
     
  3. cjddmut

    cjddmut

    Joined:
    Nov 19, 2012
    Posts:
    179
    0.1.1
     
  4. Joachim_Ante

    Joachim_Ante

    Unity Technologies

    Joined:
    Mar 16, 2005
    Posts:
    5,203
    I recommend upgrading to 0.4. Serializing shared component is going through a different codepath where the shared components are actually serialized in the entity binary file.
     
    Kuptsevych-Yuriy likes this.