protected override void Init()

in rd-net/RdFramework/Impl/RdList.cs [133:191]


    protected override void Init(Lifetime lifetime, IProtocol proto, SerializationCtx ctx)
    {
      base.Init(lifetime, proto, ctx);

      if (!OptimizeNested)
      {
        Change.Advise(lifetime, it =>
        {
          if (IsLocalChange)
          {
            var definitions = TryGetBindDefinitions(lifetime);
            if (definitions == null)
              return;

            if (it.Kind != AddUpdateRemove.Add)
              definitions[it.Index]?.Terminate();

            if (it.Kind == AddUpdateRemove.Remove)
              definitions.RemoveAt(it.Index);

            if (it.Kind != AddUpdateRemove.Remove && it.NewValue != null)
            {
              it.NewValue.IdentifyPolymorphic(proto.Identities, proto.Identities.Next(RdId));
              definitions.Insert(it.Index, TryPreBindValue(lifetime, it.NewValue, it.Index, false));
            }
          }
        });
      }

      using (UsingLocalChange())
      {
        Advise(lifetime, it =>
        {
          if (!IsLocalChange) return;

          proto.Wire.Send(RdId, SendContext.Of(ctx, it, this), static(sendContext, stream) =>
          {
            var sContext = sendContext.SzrCtx;
            var evt = sendContext.Event;
            var me = sendContext.This;

            stream.WriteInt64((me.myNextVersion++ << versionedFlagShift) | (long)evt.Kind);

            stream.WriteInt32(evt.Index);
            if (evt.Kind != AddUpdateRemove.Remove)
              me.WriteValueDelegate(sContext, stream, evt.NewValue);

            SendTrace?.Log($"list `{me.Location}` ({me.RdId}) :: {evt.Kind} :: index={evt.Index} :: " +
                           $"version = {me.myNextVersion - 1}" +
                           $"{(evt.Kind != AddUpdateRemove.Remove ? " :: value = " + evt.NewValue.PrintToString() : "")}");
          });

          if (!OptimizeNested)
            it.NewValue.BindPolymorphic();
        });
      }


    }