//________________________________________________________________________ public bool Serialize(System.IO.Stream stream, Ruta_Corta.Matrix matrix) { using (var writer = new System.IO.StreamWriter(stream, System.Text.Encoding.UTF8)) { return(this.Serialize(writer, matrix)); } }
//________________________________________________________________________ public bool Serialize(string file, Ruta_Corta.Matrix matrix) { if (string.IsNullOrEmpty(file)) { return(false); } if (System.IO.File.Exists(file)) { System.IO.File.SetAttributes(file, System.IO.FileAttributes.Normal); System.IO.File.Delete(file); } //----- using (var writer = new System.IO.StreamWriter(file, false, System.Text.Encoding.UTF8)) { return(this.Serialize(writer, matrix)); } }
//________________________________________________________________________ internal void WriteMatrix(System.IO.TextWriter writer, Ruta_Corta.Matrix matrix, int flags) { for (byte r = byte.MinValue; r < matrix.m_Size.Row; ++r) { for (byte c = byte.MinValue; c < matrix.m_Size.Column; ++c) { switch (matrix.m_Buffer[r, c]) { case Ruta_Corta.CellType.Verde: writer.Write(((flags & 2) > 0) ? FIXCHAR : FRECHAR); break; case Ruta_Corta.CellType.Negro: writer.Write(((flags & 4) > 0) ? WAYCHAR : FRECHAR); break; default: writer.Write(FRECHAR); break; } } writer.WriteLine(); } }
//________________________________________________________________________ public virtual bool Serialize(System.IO.TextWriter writer, Ruta_Corta.Matrix matrix) { if ((matrix.m_Size.Column < 3) || (matrix.m_Size.Row < 3)) { return(false); } writer.WriteLine(); writer.WriteLine(";" + System.Windows.Forms.Application.ProductName); writer.WriteLine(";Version: " + System.Windows.Forms.Application.ProductVersion); writer.WriteLine(";Matrix ({0}, {1})", matrix.m_Size.Row, matrix.m_Size.Column); writer.WriteLine(); writer.WriteLine(";Matrix is:"); this.WriteMatrix(writer, matrix, 0x3); writer.WriteLine(); writer.WriteLine(); if (!matrix.Contains(Ruta_Corta.CellType.Negro)) { return(true); } writer.WriteLine(";Way is:"); this.WriteMatrix(writer, matrix, 0x5); writer.WriteLine(); writer.WriteLine(); writer.WriteLine(";Matrix and Way is:"); this.WriteMatrix(writer, matrix, 0x7); writer.WriteLine(); writer.WriteLine(); return(true); }
//________________________________________________________________________ public virtual Ruta_Corta.Matrix Deserialize(System.IO.TextReader reader) { Ruta_Corta.Matrix ret = null; if (reader == null) { return(null); } //----- var matrixsize = new Ruta_Corta.Point(); using (var readflatbuffer = new System.IO.MemoryStream()) { while (matrixsize.Row < byte.MaxValue) { string line = reader.ReadLine(); //End of file? if (line == null) { break; } byte length; if (line.Length >= byte.MaxValue) { length = byte.MaxValue; } else { length = (byte)line.Length; } //End of matrix? if (length < 3) { if (matrixsize.Column <= byte.MinValue) { continue; } break; } //Remark? string trimline = line.TrimStart(); if ((!string.IsNullOrEmpty(trimline)) && (trimline[0] == ';')) { continue; } //First row? if (matrixsize.Column <= byte.MinValue) { matrixsize.Column = (byte)length; } //Read new line ... ++matrixsize.Row; for (byte i = byte.MinValue; i < matrixsize.Column; ++i) { if (i < length) { readflatbuffer.WriteByte(FALSECHARS.IndexOf(line[i]) >= 0 ? (byte)0 : (byte)1); } else { readflatbuffer.WriteByte((byte)0); } } //end for. } //end while. //----- if ((matrixsize.Column < 3) || (matrixsize.Row < 3)) { return(null); } //Convert from flat to matrix ... readflatbuffer.Position = 0L; ret = new Ruta_Corta.Matrix(matrixsize); for (byte r = byte.MinValue; r < matrixsize.Row; ++r) { for (byte c = byte.MinValue; c < matrixsize.Column; ++c) { ret.m_Buffer[r, c] = readflatbuffer.ReadByte() > 0 ? Ruta_Corta.CellType.Verde : Ruta_Corta.CellType.Blanco; } } }//end using. return(ret); }