static object[] ReadObjectArray(PivotDataStateBinaryReader rdr) { var arrLen = rdr.Read7BitEncodedLong(); var arr = new object[arrLen]; for (ulong i = 0; i < arrLen; i++) { arr[i] = ReadObject(rdr); } return(arr); }
static uint[][] ReadValueKeys(PivotDataStateBinaryReader rdr, uint dimCount) { var arrLen = rdr.Read7BitEncodedLong(); var res = new uint[arrLen][]; for (ulong i = 0; i < arrLen; i++) { var entry = new uint[dimCount]; for (int j = 0; j < dimCount; j++) { entry[j] = rdr.Read7BitEncodedInt(); } res[i] = entry; } return(res); }
static object ReadObject(PivotDataStateBinaryReader rdr) { var typeCode = rdr.ReadByte(); if (typeCode < TypeCodeReaders.Length) { return(TypeCodeReaders[typeCode](rdr)); } switch (typeCode) { case (byte)ExtraTypeCode.ObjectArray: return(ReadObjectArray(rdr)); case (byte)ExtraTypeCode.KeyEmpty: return(Key.Empty); } throw new InvalidDataException(String.Format("Unknown type code: {0}", typeCode)); }
/// <summary> /// Deserializes <see cref="PivotDataState"/> from binary data contained by the specified stream /// </summary> /// <param name="stream">The <see cref="Stream"/> that contains serialized <see cref="PivotDataState"/> data</param> /// <returns>deserialized <see cref="PivotDataState"/> instance</returns> /// <remarks> /// This method is not supported in .NET Standards (.NET Core) PivotData build (use Json.NET or protobuf-net instead). /// </remarks> public static PivotDataState Deserialize(Stream stream) { using (var rdr = new PivotDataStateBinaryReader(stream)) { var typeName = rdr.ReadString(); if (typeName != typeof(PivotDataState).FullName) { throw new InvalidDataException(); } // read version (reserved for future) var majorVer = rdr.ReadInt32(); var minorVer = rdr.ReadInt32(); var propsCount = rdr.ReadUInt16(); var pvtDataState = new PivotDataState(0, null, null, null); for (short propIdx = 0; propIdx < propsCount; propIdx++) { var propName = rdr.ReadString(); switch (propName) { case "KeyValues": var keyValues = ReadObject(rdr); if (keyValues is object[]) { pvtDataState.KeyValues = (object[])keyValues; } else { throw new InvalidDataException("Invalid value type: KeyValues"); } break; case "Values": var values = ReadObject(rdr); if (values is object[]) { pvtDataState.Values = (object[])values; } else { throw new InvalidDataException("Invalid value type: Values"); } break; case "DimCount": pvtDataState.DimCount = rdr.ReadUInt32(); break; case "ValueKeys": if (pvtDataState.DimCount == 0) { throw new InvalidDataException("Missed DimCount property"); } pvtDataState.ValueKeys = ReadValueKeys(rdr, pvtDataState.DimCount); break; default: throw new InvalidDataException(String.Format("Unknown property: {0}", propName)); } } return(pvtDataState); } }