Не может реализовать дискриминационное объединение и сериализовать его - PullRequest
0 голосов
/ 15 февраля 2019

Здравствуйте, я пытаюсь создать иерархию классов, используя discriminated union, и, кажется, я не могу их сериализовать. Я получаю эту ошибку:

Newtonsoft.Json.JsonSerializationException: 'Self referencing loop detected for property 'AsRun' with type 'MsgPattern.Message+Run'. Path ''.'

Базовый класс

[Serializable]
    public abstract partial class Message {
        public enum Type {
            WALK = 0,
            RUN = 1
        }
        protected abstract Type Discriminator { get; }
        public Type Kind => this.Discriminator;

        internal static Message Create(string data) {
            var message = JsonConvert.DeserializeObject<Message>(data);
            switch (message.Kind) {
                case Type.RUN:message= message.AsRun;break;
                case Type.WALK:message= message.AsWalk;break;
            }
            return message;
        }
        [JsonIgnore]
        public bool IsWalk => this.Kind==Type.Walk;
        [JsonIgnore]
        public bool IsRun => this.Kind==Type.Run;
        [JsonIgnore]
        public Message.Walk AsWalk => this as Message.Walk;
        [JsonIgnore]
        public Message.Run AsRun => this as Message.Run;


    }

Дервив

partial class Message {

        public class Run : Message {
            protected override Type Discriminator => Type.RUN;
            public string Location { get; set; }
            public int Speed { get; set; }
        }
    }

partial class Message {

        public class Walk : Message {
            protected override Type Discriminator => Type.WALK;
            public int Gait { get; set; }
            public bool IsJogging { get; set; }
        }
    }

Использование

class Program {


   static void Main(string[] args) {
        Message.Run run = new Message.Run { Location = "asa", Speed = 33 };
        string data = JsonConvert.SerializeObject(run);
        Message msg=Message.Create(data);
    }
}

Я будуполучать сообщения такого типа через json, и я хочу иметь возможность выполнять действия на основе их type.Я не понимаю, почему я не могу их сериализовать.

PS Я знаю, что это самореференсный цикл, но мне нужны эти поля As[something] и Is[Something].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...