Первая сериализация успешна, вторая - нет? Зачем? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть метод сериализации данных связи. Сначала параметры сериализуются в основной объект CallInformation в виде строки, затем объект CallInformation также будет сериализован, а затем записан в файл:

_jSONSettings = new System.Runtime.Serialization.Json.DataContractJsonSerializerSettings();
            _jSONSettings.DateTimeFormat = new DateTimeFormat("yyyy-MM-ddThh:mm:ss.fffZ");

            _xmlWriterSettings = new System.Xml.XmlWriterSettings() { Indent = true };

var callInformation = logEvent.Properties.Values.First() as CallInformation;

            DataContractJsonSerializer serializer;
            if (TakeCharsInParameterObject > 0)
            {
                var counter = 0;
                foreach (object param in callInformation.Parameters)
                {
                    using (var stream = new MemoryStream())
                    {
                        serializer = new DataContractJsonSerializer(param.GetType(), _jSONSettings);
                        using (var xmlWriter = System.Xml.XmlWriter.Create(stream, _xmlWriterSettings))
                        {
                            serializer.WriteObject(xmlWriter, param);
                            stream.Flush();
                            stream.Position = SkipCharsInParameterObject;
                            using (var streamReader = new StreamReader(stream))
                            {
                                var buffer = new char[TakeCharsInParameterObject];
                                if (streamReader.Peek() >= 0)
                                {
                                    streamReader.Read(buffer, 0, buffer.Length);
                                    counter++;
                                    callInformation.SerializedParameters += "{Parameter" + counter + ": " + new string(buffer) + "}";
                                }
                            }
                        }
                    }
                }
            }


            var restult = "";
            using (var stream = new MemoryStream())
            {
                serializer = new DataContractJsonSerializer(typeof(CallInformation), _jSONSettings);
                using (var xmlWriter = System.Xml.XmlWriter.Create(stream, _xmlWriterSettings))
                {
                    serializer.WriteObject(xmlWriter, callInformation);
                    stream.Flush();
                    stream.Position = 0;
                    using (var streamReader = new StreamReader(stream))
                    {
                        if (streamReader.Peek() >= 0)
                            restult = streamReader.ReadToEnd();
                    }
                }
            }
            return restult;

Сериализация параметров отлично работает, но вторая часть - нет. После stream.WriteObject длина потока и позиция по-прежнему равны 0?

CallInformation - это простой класс DataContract, который выглядит так:

   [DataContract]
    public class CallInformation
    {
        public CallInformation()
        { }

        [DataMember]
        public string Address { get; set; }
        [DataMember]
        public Boolean IsEmpty { get; set; }
        [DataMember]
        public Boolean IsFaulted { get; set; } = false;
        [DataMember]
        public string Action { get; set; }
        [DataMember]
        public CallOrder CallDirection { get; set; }

        public DateTime EventTime { get; set; } = DateTime.Now;
        [DataMember]
        public TimeSpan Duration { get; set; }
        [DataMember]
        public Boolean IsCallback { get; set; } = false;
        [DataMember]
        public string LogSource { get; set; } = "Unknown";
        [DataMember]
        public string SerializedParameters { get; set; } = "";

        public List<object> Parameters { get; set; } = new List<object>();
        [DataMember]
        public string EventTimeDisplay
        {
            get { return EventTime.ToString("HH:mm:ss.fffffff"); }
            set { }
        }
    }

Почему не работает вторая сериализация ?

1 Ответ

0 голосов
/ 26 мая 2020

XmlWriter имеет внутренний буфер, вам нужно sh проверить его, чтобы изменить позицию потока:

serializer.WriteObject(xmlWriter, callInformation);
xmlWriter.Flush();
stream.Position = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...