/// <summary> /// 将一个对象字段转换为二进制元数据 /// </summary> /// <param name="metadata">需要转换成元数据的Value字典</param> /// <param name="proxy">内存段代理器</param> internal unsafe static void ToBytes(ResourceBlock metadata, IMemorySegmentProxy proxy) { Dictionary <byte, BaseValueStored> valueStoreds = metadata.GetMetaDataDictionary(); uint markRangeLength = (uint)(valueStoreds.Count * 5); MemoryPosition wrapperStartPosition = proxy.GetPosition(); proxy.Skip(4U); proxy.WriteUInt16((ushort)(valueStoreds.Count)); MemoryPosition wrapperMarkRangeStartPosition = proxy.GetPosition(); proxy.Skip(markRangeLength); MemoryPosition wrapperOffsetStartPosition = proxy.GetPosition(); MarkRange * markRange = stackalloc MarkRange[valueStoreds.Count]; int i = 0; foreach (KeyValuePair <byte, BaseValueStored> valueStored in valueStoreds) { //转化成二进制数组的形式 MemoryPosition wrapperCurrentPosition = proxy.GetPosition(); uint currentOffset = (uint)MemoryPosition.CalcLength(proxy.SegmentCount, wrapperOffsetStartPosition, wrapperCurrentPosition); (markRange + i)->Id = valueStored.Key; (markRange + i++)->Flag = (uint)((currentOffset << 8) | (int)valueStored.Value.TypeId); if (valueStored.Value.IsNull) { continue; } valueStored.Value.ToBytes(proxy); } MemoryPosition wrapperEndPosition = proxy.GetPosition(); //回写mark Range proxy.WriteBackMemory(wrapperMarkRangeStartPosition, markRange, markRangeLength); //回写4bytes总长 proxy.WriteBackInt32(wrapperStartPosition, MemoryPosition.CalcLength(proxy.SegmentCount, wrapperStartPosition, wrapperEndPosition)); }
/// <summary> /// Attempts packing a ResourceBlock as a MetadataContainer /// </summary> /// <param name="resource">Targeted ResourceBlock object.</param> /// <returns>return a packed MetadataContainer object.</returns> public static MetadataContainer AsMetadataContainer(this ResourceBlock resource) { return(new MetadataContainer(resource.GetMetaDataDictionary())); }