Placement system saving issue

I’m currently working on a placement system for my game, everything else is working fine but when the saved placements are loaded, their rotation is not correct, they are rotated slightly differently from how they were placed.
Placing:
robloxapp-20220826-0749101.wmv (575.7 KB)
Loading:
robloxapp-20220826-0749331.wmv (958.5 KB)

Saving code:

game.Players.PlayerRemoving:Connect(function(plr)  

	local items = {}
	local lab = workspace.PlotFolder:FindFirstChild(plr.Name)
	local theItems = lab.PlacedFurniture
	for i,v in pairs(theItems:GetChildren()) do
		if(v:IsA("Model")) then
			local vector,axis = v:GetPrimaryPartCFrame():toAxisAngle()
			local pos = v.PrimaryPart.Position - lab.Plot.Floor.Position
			table.insert(items,{v.Name,pos.x,pos.y,pos.z,axis})
		end
	end

	placedItems:SetAsync(plr.UserId,items)
end)

Loading code:

claimEvent.Event:Connect(function(player)
	local pItems = placedItems:GetAsync(player.UserId)
	local lab = workspace.PlotFolder:FindFirstChild(player.Name)
	local furnThing = lab.PlacedFurniture
	for i=1,#pItems do
		local v = pItems[i]
		local furn = game.ReplicatedStorage.Items:FindFirstChild(v[1]):Clone()
		furn.Parent = furnThing
		furn:SetPrimaryPartCFrame(lab.Plot.Floor.CFrame + Vector3.new(v[2],v[3],v[4]))
		furn:SetPrimaryPartCFrame(furn:GetPrimaryPartCFrame() * CFrame.Angles(0,v[5],0))
	end
end)

Any help on how to fix this issue would be highly appreciated.

Try instead of saving v:GetPrimaryPartCFrame():toAxisAngle(), save the Position and Rotation, and then create the CFrame using both of them: CFrame.new(Position) * CFrame.Angles(Rotation)

When saving the location Data, it would also be better to save the names of the data, inside of the table, just so its easier for yourself to understand whats being loaded:

local DataTable = {
{Name = 'Cube'; Position = Cube.Position; Rotation = Cube.Rotation};
{Name = 'Sphere'; Position = Sphere.Position; Rotation = Sphere.Rotation};
}

Im not sure how this would work with your plot system though.

I tried doing what you said but the code doesn’t seem to work, here’s the updated code for saving and loading,

Saving:

game.Players.PlayerRemoving:Connect(function(plr)  

	local items = {}
	local lab = workspace.PlotFolder:FindFirstChild(plr.Name)
	local theItems = lab.PlacedFurniture
	for i,v in pairs(theItems:GetChildren()) do
		if(v:IsA("Model")) then
			local Position = v.PrimaryPart.Position
			local Rotation = v.PrimaryPart.Rotation
			local pos = Position - lab.Plot.Floor.Position
			table.insert(items,{v.Name,pos.x,pos.y,pos.z,Position,Rotation})
		end
	end

	placedItems:SetAsync(plr.UserId,items)
end)

Loading:

claimEvent.Event:Connect(function(player)
	local pItems = placedItems:GetAsync(player.UserId)
	local lab = workspace.PlotFolder:FindFirstChild(player.Name)
	local furnThing = lab.PlacedFurniture
	for i=1,#pItems do
		local v = pItems[i]
		local furn = game.ReplicatedStorage.Items:FindFirstChild(v[1]):Clone()
		furn.Parent = furnThing
		furn:SetPrimaryPartCFrame(lab.Plot.Floor.CFrame + Vector3.new(v[2],v[3],v[4]))
		furn:SetPrimaryPartCFrame(furn:GetPrimaryPartCFrame() * CFrame.new(v[5]) * CFrame.Angles(v[6]))
	end
end)