public override bool Serialize <TSerializedResource>(KeyedResource owner, ref TSerializedResource[] serializedResources, ref short length, params Type[] expectedTypes) { var ownerLength = _offset - owner.Offset; var remainingLength = length - ownerLength; var buffer = new byte[remainingLength]; if (Read(buffer, buffer.Length) != remainingLength) { return(false); } using (var subSerializer = new ReadResourceSerializer(new MemoryStream(buffer))) { var children = new List <TSerializedResource>(); for (;;) { // :frowning: var child = (TSerializedResource)(SerializedResource)subSerializer.SerializeKeyedResource(expectedTypes); if (child == null) { serializedResources = children.ToArray(); return(true); } children.Add(child); } } }
private KeyedResource SerializeKeyedResource(params Type[] expectedTypes) { var keyedResourceHeader = new KeyedResource(); var offset = _offset; if (!keyedResourceHeader.Serialize(this)) { return(null); } foreach (var expectedType in expectedTypes) { var keyedResource = (KeyedResource)Activator.CreateInstance(expectedType); keyedResource.Offset = offset; keyedResource.wValueLength = keyedResourceHeader.wValueLength; keyedResource.wLength = keyedResourceHeader.wLength; keyedResource.wType = keyedResourceHeader.wType; keyedResource.szKey = keyedResourceHeader.szKey; var validatedKeyedResource = keyedResource as ValidatedKeyedResource; if (validatedKeyedResource == null || validatedKeyedResource.Validate()) { return(keyedResource.SerializeValue(this) && keyedResource.SerializeChildren(this) ? keyedResource : null); } } return(null); }
public override bool Serialize <TSerializedResource>(KeyedResource owner, ref TSerializedResource[] serializedResources, ref short length, params Type[] expectedTypes) { var ownerLength = _totalWritten - owner.Offset; using (var memoryStream = new MemoryStream()) using (var writer = new WriteResourceSerializer(memoryStream)) { foreach (var serializedResource in serializedResources) { var localSerializedResource = serializedResource; writer.Serialize(ref localSerializedResource); } var bytes = memoryStream.ToArray(); length = (short)(ownerLength + bytes.Length); return(Write(bytes)); } }
private void ClearHeader(KeyedResource r) { r.wLength = 0; r.wValueLength = 0; }
public abstract bool Serialize <TSerializedResource>(KeyedResource owner, ref TSerializedResource[] serializedResources, ref short length, params Type[] expectedTypes) where TSerializedResource : SerializedResource, new();